如何解决在函数内部扩展C数组
这在主程序中起作用,但是在放入函数时会中断。我不确定传递给函数后如何重新分配指针。
void expandArray(int** arr[],int* size) {
int *temp;
*temp = *arr;
*arr = (int*) malloc(*size * 2 * sizeof(int));
for (int i = 0; i < *size; i++) {
printf("assigning from temp: %d ",temp[i]);
arr[i] = temp[i];
printf("to arr: %d \n",arr[i]);
}
*size = *size * 2;
free(temp);
}
main(){
int *arr;
arr = (int*) malloc(maxSize * sizeof(int));
if ....
expandArray(arr,&arrSize);
// use bigger arr for other stuff
}
解决方法
在main
中,arr
被声明为int *arr
。当main
调用expandArray
时,它应该传递一个指向arr
且类型为&arr
的{{1}}指针。
但是,您将int **a
的参数声明为expandArray
,并添加了方括号。这些都是不必要的,并且可以更改类型,并且您的编译器应该已经对此发出警告。注意编译器警告。确保您了解它们,并在继续之前解决它们。
在int **arr[]
中,您同时使用expandArray
和arr[i]
来访问数组。但是,temp[i]
不是访问数组元素的正确方法。更正了arr[i]
参数的声明后,它将为arr
,并且将数组元素称为int **arr
是不合适的。将会是arr[i]
。
常见的做法是,为了减少混淆,作者将使用一个临时变量来保存指针,因此他们不需要多余的星号:
(*arr)[i]
其他几点:
- 调用
int *NewArray = malloc(...); // Get new space. *arr = NewArray; // Send new address to caller. ... NewArray[i] = temp[i]; // Use temporary variable for access.
时,请使用malloc
,其中sizeof *p
是要分配给的指针,而不是p
。这样比较好,因为如果以后要更改sizeof(int)
的类型,则只需要在其声明中进行更改,而不必在p
中进行更改。这样一来,在一个地方而不是另一个地方改变的可能性就很小了。 - 请勿强制转换
sizeof
的结果。尽管在C ++中是必需的,但这在C中是不必要的。 -
malloc
应该声明为main
或int main(void)
,而不是int main(int argc,char *argv[])
。 (C实现也可以提供其他形式。) - 将
main()
用于数组的大小,而不是size_t
,将int
或size_t
用于数组的索引。
总体而言,代码可能是:
ptrdiff_t
,
我认为arr应该是int **类型。
void expandArray(int** arr,int* size) {
int *temp;
temp = *arr;
*arr = (int*) malloc(*size * 2 * sizeof(int));
for (int i = 0; i < *size; i++) {
printf("assigning from temp: %d ",temp[i]);
(*arr)[i] = temp[i];
printf("to arr: %d \n",(*arr)[i]);
}
*size = *size * 2;
free(temp);
}
如果只想扩展数组大小,则可以使用realloc。 并且扩展区域应使用memset初始化。
void expandArray(int** arr,int* size) {
*arr = (int*) realloc(*arr,*size * 2 * sizeof(int));
memset(*arr+*size,*size * sizeof(int));
*size = *size * 2;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。