不同电脑结果不同

Different results on different computers

我对以下代码有疑问:

#include <stdlib.h>
#include <stdio.h>
void red(int *);
int main()
{
    int *wsk,i;
    wsk = (int*)malloc(10*sizeof(int));
    for(i=0;i<10;i++)
    {
        wsk[i]=i+100;
        printf("value: %d num pointer:%p \n",wsk[i],wsk+i);
    }

    printf("\n\n");
    red(wsk);
    printf("\n\n");
    for(i=0;i<11;i++)
    {
        printf("value: %d num pointer:%p \n",wsk[i],wsk+i);
    }
    free(wsk);
    return 0;
}
void red(int* wsk)
{
    int i;
    wsk = realloc(wsk,11*sizeof(int));
        for(i=0;i<11;i++)
    {
        printf("value: %d num pointer:%p \n",wsk[i],wsk+i);
    }
}

在学校计算机上,此代码有效,函数 red 中的 wsk 指针与 main 中的指针相同。当我 运行 在不同的计算机上使用相同的代码时,我得到不同的结果

我电脑的结果:

来自另一台计算机的结果:

重新分配的地址只保留在红色函数范围内。然后你取消引用旧指针。

void red(int** wsk)
{
    int i;
    *wsk = realloc(*wsk,11*sizeof(int));
    ...
}

您的函数 void red(int* wsk) 通过了 wsk by value,这意味着 wsk 的本地版本被复制到函数中,并且在 red 中所做的更改不会反映在 main.

解决这个问题的一种方法是 return wsk 的新值到 main:

int* red(int* wsk) // Return type changed
{
    int i;
    wsk = realloc(wsk,11*sizeof(int));
    for(i=0;i<11;i++)
    {
        printf("value: %d num pointer:%p \n",wsk[i],wsk+i);
    }

    return wsk; // Return new wsk
}

然后将main中的调用改为

wsk = red(wsk);

以便 main 中的 wsk 更新为由 red 编辑的 wsk return。


另请注意,您在调用 realloc() 后从未初始化 wsk[10] 并且访问它会导致更多未定义的行为。