我遇到以下代码的问题:
#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中的相同。当我在另一台计算机上运行相同的代码时,我会得到不同的结果
我的电脑的结果:
其他电脑的结果:
答案 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()
并访问它会导致更多未定义的行为。