为何除main函数外无法成功为一维数组分配空间?
问题原因分析与解决方案
核心问题:C语言的值传递机制
你遇到的问题本质是没搞懂C语言的参数传递规则——哪怕是指针类型,函数参数也是值传递。
在你的create函数里,values是main中nums的一个局部副本。当你调用malloc给values分配内存时,修改的只是这个副本的地址,main里的nums还是原来的未初始化野指针。所以回到main调用print时,你访问的是野指针指向的非法内存,自然得到垃圾值。
而create函数内部打印正常,是因为此时函数里的values是刚分配好的有效指针,指向的内存是合法的,能正常读写。
两种修复方案
方案1:使用二级指针传递(让函数修改原指针的地址)
修改create函数为接收二级指针,直接修改原指针的指向:
void create(int **values, int n ) { // 给原指针指向的内存地址分配空间 *values = malloc(n*sizeof(int)); for (int i=0; i<n; i++) // 注意括号,先解引用再访问数组元素 (*values)[i] = rand()%100; }
main里调用时需要传指针的地址:
int main() { int *nums, mid; srand(time(0)); create(&nums, 30); // 传nums的地址 print(nums, 30); }
方案2:让函数返回分配好的指针
直接把create函数改成返回指针类型,让main接收分配好的地址:
int* create(int n ) { int *values = malloc(n*sizeof(int)); for (int i=0; i<n; i++) values[i] = rand()%100; return values; }
main里调用时直接赋值:
int main() { int *nums, mid; srand(time(0)); nums = create(30); // 接收返回的指针 print(nums, 30); }
额外提醒
记得使用完动态分配的内存后,用free(nums)释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者spookikitti
相关产品推荐
相关产品推荐

