为什么不是连续数组条目的地址,也是连续的?

Ayu*_*oel 0 c arrays pointers pointer-arithmetic

我跑的时候

char * a = "string";
char * b = a;
while (*a != '\0')
    printf("%p %c\n", *(a), *(a++));
printf("%p\n", *(b+2));
Run Code Online (Sandbox Code Playgroud)

输出看起来像

0x73 s
0x74 t
0x72 r
0x69 i
0x6e n
0x67 g
0x72
Run Code Online (Sandbox Code Playgroud)

此外,程序如何确定(b + 2)位于0x72.我认为它只会将2添加到b的起始地址,在本例中为0x73.

编辑:这不是未指定行为的情况.正如答案中所解释的那样,我错误地将值传递给地址格式说明符而不是指针本身.

Mat*_*lia 6

尝试

printf("%p %c\n", (void *)a, *a);
a++;
Run Code Online (Sandbox Code Playgroud)

并且高兴,连续的元素实际上是连续的!

您的代码出了什么问题:

  • 当你写的时候,*(a)你传递给当前字符printf而不是它的地址,然后打印出来printf就好像它是一个指针; 你看到的十六进制值是字符的字符代码"string"而不是它们的地址(请注意,printf从格式字符串的预期传递给不同的参数是未定义的行为,它产生一些合理的输出是偶然的);
  • 第二个printf也受同样的错误影响;
  • 你会注意到我在这里也把分隔语句中的增量分开了; 正如haccks指出的那样,因为它们最初还有另一个未定义行为的原因,因为函数调用不会在其参数的评估之间引入序列点; 这意味着它是未定义的,首先评估哪一个,因此评估a第二个参数之前或之后是否递增printf.
  • 不推荐使用char *而不是const char *指向字符串文字的指针;