我似乎无法理解为什么在这种情况下我的指针会改变地址:
int *load(FILE *fp, int * vector, int w, int h){
//other coding
int array[w][h];
int *ptr = &array;
return ptr;
}
main(){
//other coding
int *ptr = load(file, vector, w, h);
printf("%d ", *(ptr));
printf("%d ", *(ptr));
}
在我的第一个printf("%p ", *(ptr));
中打印 00000010
在我的第二个printf("%p ", *(ptr));
中打印 0028fc6c
当然,如果我用"%d"
打印值,首先是好的,第二个不是。
答案 0 :(得分:1)
从array
返回的load()
地址是该函数的局部变量。你永远不应该返回它的地址,因为它在堆栈上被分配,并将被重用于后续的函数调用。
您看到的更改后的值是因为对printf()
的调用正在更新堆栈的位置。
答案 1 :(得分:0)
当您打印*(ptr)时,如果要打印ptr try&(ptr)的地址,则会尝试在位置ptr处打印该值。
答案 2 :(得分:0)
首先,您不打印指针,而是打印指针指向的值。这是一元*
运算符的作用:它使您可以访问指向的值。所以你所观察到的任何东西都不会暗示某些人会解决这个问题。已经改变。您没有检查程序中的任何地址。
其次,上述可能意味着它不是指针发生变化。它的尖头值会发生变化。实际上,从函数返回的指针指的是无效的内存位置(以前不再存在的本地数组的站点)。在没有任何明显原因的情况下,无效的内存位置会更改其值,这一点并不罕见。它被称为未定义的行为。你的程序可能已经崩溃了,但是出于纯粹的运气而不是崩溃,你得到的价值会发生变化,并且令人费解......"。
第三,即使您的代码可能已经编译并且#34;通过宽松的编译器,它仍然包含约束违规,即"编译错误"。此初始化无效
int *ptr = &array;
&array
值的类型为int (*)[w][h]
。它不能用于初始化类型int *
的指针。我确定编译器告诉了你这件事。您必须密切关注编译器发出的诊断消息。
答案 3 :(得分:0)
您正在尝试打印本地声明的数组的地址。 在函数外部声明数组,即全局。
试试这个方法:
int array[w][h];
int *load(FILE *fp, int * vector, int w, int h){
//other coding
int *ptr = &array;
return ptr;
}
main(){
//other coding
int *ptr = load(file, vector, w, h);
printf("%d ", *(ptr));
}