C语言copyArray函数异常问题咨询:需复制指针数组保留原数组
分析copyArray函数无法正常工作的原因及修复方案
你的copyArray函数存在两个致命问题,直接导致它无法正确返回新数组的指针:
1. 返回值类型声明错误
你把函数的返回类型声明为int,但实际上我们需要返回的是指向int数组的指针,也就是int*。这种类型不匹配会让编译器把你原本的指针地址隐式转换成整数,丢失正确的内存地址信息——后续用这个错误的值去访问数组,必然会触发内存访问错误或者输出乱码。
2. 返回的内容错误
函数最后写的是return *z;,这是取z指针指向的第一个元素的值(一个整数),而不是返回z本身(新分配数组的首地址)。这完全违背了“返回新数组指针”的需求。
修复后的copyArray函数
我们只需要修正这两个问题,就能让函数正常工作:
/* 复制数组,返回指向同尺寸同值新数组的新指针 */ int* copyArray(int *p, int length) { // 可选但推荐:检查输入合法性 if (p == NULL || length <= 0) { return NULL; } int *z = (int*)malloc(length*sizeof(int)); // 必须:检查malloc是否成功分配内存,避免空指针访问 if (z == NULL) { return NULL; } // 正向遍历复制,逻辑更直观(反向遍历也可以,只要返回z即可) for(int i = 0; i < length; i++) { z[i] = p[i]; } // 返回新数组的首地址 return z; }
额外补充说明
- 循环改成正向遍历只是为了逻辑更清晰,你也可以保留原来的反向写法,核心是要返回
z而不是*z。 - 加上输入合法性检查和
malloc失败判断,是写出健壮C代码的好习惯,能避免很多潜在崩溃问题。 - 记得在使用完
z指向的数组后,调用free(z);释放内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Eliran_B
相关产品推荐
相关产品推荐

