gpt4 book ai didi

c - 为什么指向下一个内存位置的指针有 12 个差异

转载 作者:行者123 更新时间:2023-11-30 21:27:21 25 4
gpt4 key购买 nike

为什么下面的程序将内存差异带到下一个位置修复 12 在下一个内存位置或其有一些 char/float/int 的逻辑与下一个位置有不同的 -2 差异

包括 #包括

int main () {

char var;
char *ptr;
char **pptr;
char ***ppptr;
char ****pppptr;

var = 'M';

/* take the address of var */
ptr = &var;

/* take the address of ptr using address of operator & */
pptr = &ptr;

ppptr=&pptr;

ppptr=&pptr;
ppptr=&pptr;
pppptr=&ppptr;

/* take the value using pptr */
printf("Value of var = %d\n", var );
printf("Value available at *ptr = %c....and address is %u\n", *ptr ,ptr);
printf("Value available at **pptr = %c....and address is %u\n", **pptr,pptr);
printf("Value available at ***ppptr = %c....and address is %u\n", ***ppptr ,ppptr);
printf("Value available at ****pppptr = %c....and address is %u\n", ****pppptr,pppptr);
getch();
return 0;
}
//out put
///-----------------------------------------------
Value of var = 77;
Value available at *ptr = M....and address is 11401207
Value available at **pptr = M....and address is 11401192 why differnceis 12 in memory locaton
Value available at ***ppptr = M....and address is 11401180
Value available at ****pppptr = M....and address is 11401168

最佳答案

您似乎在问为什么ptr的地址,通过使用scanf字段描述符打印pptr的值来判断%u 似乎与下一个声明的局部变量 pptr 的地址相差 12 个字节。我想其他局部变量也是如此。

事实上,正如 @SouravGhosh 在他的回答中已经描述的那样,%u 字段描述符与指针参数没有正确对应,因此 scanf 调用的效果,包括输出的所有方面,均未定义。

但是,实际结果对于问题的目的并不重要。 C 语言没有提供任何理由来假设任何函数的局部变量的地址之间的任何特定顺序或差异。这是由编译器决定的。因此,这个问题没有一般性的答案。

如果我们假设您观察到的输出恰好准确地反射(reflect)了局部变量地址之间的差异(这绝不是确定的),那么这表明编译器是故意的在变量之间留下填充。无论出于任何目的,这样做都是完全自由的。例如,编译器可能会尝试最小化通过指向局部变量的指针访问局部变量的代码中差一错误的潜在影响。

关于c - 为什么指向下一个内存位置的指针有 12 个差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52225773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com