不同电脑结果不同
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]
并且访问它会导致更多未定义的行为。
我对以下代码有疑问:
#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]
并且访问它会导致更多未定义的行为。