【问题标题】:String offset inside a function函数内的字符串偏移量
【发布时间】:2014-03-31 10:18:37
【问题描述】:

最近我偶然发现了这个奇怪的代码:

main(){
char c[] = "STRING";
puts("AKSHAY"+2);
printf("%s",c+2);
}

输出:

SHAY
RING

谁能解释一下这个字符串中的偏移是如何工作的。

另外,当我尝试这段 sn-p 代码时,我得到了一个编译错误:

main(){
char c[] = "STRING"+2;
printf("%s",c);
}

错误:

Line 2: error: invalid initializer

和指针有关吗?

【问题讨论】:

    标签: c string printf puts


    【解决方案1】:

    在您的以下代码中

    main(){
    char c[] = "STRING";
    puts("AKSHAY"+2);
    printf("%s",c+2);
    }
    

    这里发生的是当你写的时候

    char c[]="STRING";
    

    这意味着c 将被衰减为pointer of type char,其中包含同样为char * 类型的“STRING”的基地址。

    所以当你写的时候

    printf("%s",c+2);
    

    %s 规范意味着它将采用基地址并将字符打印到 NULL(或空格)。所以 c+2 意味着 base address +2 这就是它打印的原因

    "RING"
    

    另一方面

    puts("AKSHAY"+2);
    

    puts 也获取基地址并打印到 NULL(包括空格)

    这里的“AKSHAY”类型是char *,所以添加2意味着将基地址更改为字母S.所以输出是

    SHAY
    

    【讨论】:

    • 感谢您的详细解释。
    【解决方案2】:

    这只是基本的pointer arithmetic

    字符串字面量的类型是指向字符的指针,因此您可以向该指针添加偏移量以获取字符串的“尾部”。这发生在“函数内部”这一事实并不重要。

    您的测试不起作用,因为您无法从这样的表达式初始化数组,它必须是“裸”字符串文字。

    【讨论】:

    • 嗯,好吧,我是个新手,你说的所有话都让我一头雾水。更简单的解释将不胜感激:) 谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 2016-06-07
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2017-06-08
    • 2019-08-11
    相关资源
    最近更新 更多