不同计算机上的结果不同

时间:2018-05-15 19:58:29

标签: c memory allocation

我遇到以下代码的问题:

#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中的相同。当我在另一台计算机上运行相同的代码时,我会得到不同的结果

我的电脑的结果:

in my computer

其他电脑的结果:

other computer

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

解决此问题的一种方法是将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);

以便wsk中的main更新为wsk返回的red

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