作为编程语言学院培训的一部分,我们还学习了C语言。在测试过程中,我们遇到了一个问题,即程序输出是什么:
#include <stdio.h>
#include <string.h>
int main(){
char str[] = "hmmmm..";
const char * const ptr1[] = {"to be","or not to be","that is the question"};
char *ptr2 = "that is the qusetion";
(&ptr2)[3] = str;
strcpy(str,"(Hamlet)");
for (int i = 0; i < sizeof(ptr1)/sizeof(*ptr1); ++i){
printf("%s ", ptr1[i]);
}
printf("\n");
return 0;
}
后来,在检查了答案之后,很明显单元格(&ptr2)[3]与&ptr1[2]中的内存单元格相同,因此程序的输出是:
to be or not to be (Hamlet)
我的问题是,只有通过在笔记本上写下代码,而不检查任何编译器,才能知道某个指针(或所有变量)在内存中的其他变量之后还是之前?
注意,我不是指数组变量,所以数组中的所有元素都必须按顺序排列。
最佳答案
在本声明中:
(&ptr2)[3] = str;
ptr2
定义为内部char *ptr2
。通过这个定义,编译器负责为main
提供存储。编译器可以使用它想要的任何存储,它可以在ptr2
之前使用,也可以在ptr1
之后使用,它可以很近,也可以很远。然后
ptr1
取&ptr2
的地址。这是允许的,但我们不知道该地址相对于ptr2
或其他任何内容的位置,因为编译器可以使用它想要的任何存储。由于
ptr1
是一个ptr2
,char *
是指向&ptr2
的指针,也称为char *
。然后
char **
尝试引用(&ptr2)[3]
数组中位于char *
的元素3。但是在C的计算模型中没有数组。只有一个。当没有数组的元素3时尝试引用数组的元素3时,该行为不是由C标准定义的。因此,这段代码是一个糟糕的例子。测试作者似乎误解了C,而这段代码并没有说明其意图。
关于c - 指针地址位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54810045/