繁体   English   中英

奇怪的 C 字符串 Output

[英]Strange C String Output

当我遇到此代码时,我正试图学习 C 中的字符串。

#include <stdio.h>
int main(){
        char s[] = "Hello world";
        printf("%s" , s);
        printf("%s" , &s);
        return 0;
}

两者都将 Hello World 命名为 output。 据我了解,这个 output 对于第一种情况是可以的。 第二个效果如何? 请说清楚。

获取数组的地址与获取第一个元素的地址相同。 当使用数组的名称时,它也会衰减到它的第一个元素的地址——因此表达式s&s产生相同的结果。

s返回数组中第一项的地址, &s返回数组本身的地址——它们恰好是相同的。

一般来说,如果您希望更明确,表达式&s[0]也可用于返回第一项的地址。

s&s返回相同的地址,因此。 该地址是存储“Hello world”中的“H”的位置。

因为,
数组的名称衰减到数组中第一个元素的地址 &
第一个元素的地址与数组的地址相同。

只是为了它可能值得,如果你想获得技术,你的第二个版本:

printf("%s" , &s);

具有未定义的行为,并且仅在偶然情况下起作用。 通过显式获取地址,您将获得数组的地址(这很好),但结果的类型为“指向 12 个字符的数组的指针”,而不是printf所需的类型“指向字符的指针” s %s 转换。 由于类型不匹配,结果是未定义的行为。

然而,实际上,这纯粹是一个技术问题——代码在我知道的 C 的每个实现上都可以正常工作。

如果你想证明存在差异,你可以很容易地做到这一点。 例如:

char string[] = "hello world";

printf("without &: %p, %p\n", (void *)string, (void *)(string+1));
printf("with &:    %p, %p\n", (void *)&string, (void *)(&string+1));

在第一种情况下, string衰减为指向 char 的指针,因此在第一行,第二个指针将恰好比第一个大一个。 在第二行,我们将一个指向字符数组的指针加一,所以当我们加一时,它实际上会添加数组的大小。 在我的机器上运行它,我得到如下结果:

without &: 0038F96C, 0038F96D
with &:    0038F96C, 0038F978

char s[] 类似于 char *s,它是一个指向数组第一个元素的字符指针(它包含存储的第一个元素的地址)。 我们还可以通过存储第一个字符的地址来存储字符串。 在执行期间,计算机开始从该地址一个接一个地获取字符并创建一个字符串,直到它到达 null 字符('\0')。 在上面的例子中's'和'%s'代表相同的值(起始字符的地址)希望你能明白。 如果您使用 char s[10] (固定长度数组),您将理解一切。

s 等价于 &s[0] 所以我们传递 s[0] 的地址而不是指向 s[0] 的指针的地址,所以它会在第二种情况下打印 Hellow world。

s 是数组的名称而不是指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM