指针指向位置

Ste*_*enU 0 c arrays pointers memory-management

作为我们在编程语言学院培训的一部分,我们也学习了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;
}
Run Code Online (Sandbox Code Playgroud)

后来,在检查了答案之后,很明显单元格(&ptr2)[3]与&ptr1 [2]中的存储单元相同,所以程序的输出是: to be or not to be (Hamlet)

我的问题是,是否有可能只通过笔记本中的书面代码,而不检查任何编译器,知道某个指针(或一般所有变量)跟随或先于内存中的其他变量?

注意,我不是指数组变量,因此数组中的所有元素必须按顺序排列.

Eri*_*hil 8

在这个声明中:

(&ptr2)[3] = str;
Run Code Online (Sandbox Code Playgroud)

ptr2char *ptr2内部定义main.通过此定义,编译器负责为其提供存储ptr2.允许编译器使用它想要的任何存储 - 它可能是之前ptr1,它可能是之后ptr1,它可能是接近,它可能是很远.

然后&ptr2取地址ptr2.这是允许的,但是我们不知道该地址与ptr1其他地方的关系,因为允许编译器使用它想要的任何存储.

既然ptr2是a char *,&ptr2是指针char *,也称为char **.

然后(&ptr2)[3]试图指元件3的阵列char *,其在&ptr2.但是在C的计算模型中没有数组.那里只有一个char *.当没有数组的元素3时,当您尝试引用数组的3的元素时,行为不是由C标准定义的.

因此,这段代码就是一个糟糕的例子.看来测试作者误解了C,这段代码没有说明预期的内容.