当我打印它时,指向2D数组更改的指针

时间:2013-10-08 05:49:51

标签: c pointers codeblocks multidimensional-array

我似乎无法理解为什么在这种情况下我的指针会改变地址:

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"打印值,首先是好的,第二个不是。

4 个答案:

答案 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));    
}