创建指针数组时遇类型不兼容警告及段错误问题求助
问题分析与解决
核心错误点
- 未分配数组内存:主函数中的
array是未初始化的指针,createArray函数没有先为其分配内存就直接赋值,导致访问非法内存,触发段错误。 - 指针层级混淆:
int **array是指向int*的指针(即主函数中array变量的地址),直接用array[index]操作会访问到错误的内存区域,且类型不匹配(将int赋值给int*),引发警告。 - scanf格式符错误:
size_t类型对应的标准格式符是%zu,而非%ld,避免跨平台兼容性问题。 - 函数返回值冗余:
arrayElements函数无需返回值,定义为void*属于错误声明。
修正后的代码
#include <stdio.h> #include <stdlib.h> // 创建数组并赋值 int createArray(int **array, size_t *size) { printf("What will be the size of the array?: "); // 使用%zu作为size_t的格式符,直接传入size指针(无需&*size) if (scanf("%zu", size) != 1) { printf("Input error!\n"); return -1; } // 为数组分配内存,检查分配是否成功 *array = malloc(*size * sizeof(int)); if (*array == NULL) { printf("Memory allocation failed!\n"); return -1; } // 为数组元素赋值:*array是数组首地址,(*array)[index]访问第index个元素 for (int index = 0; index < *size; index++) { (*array)[index] = rand() % 100; } printf("\n --- Array created. Pointers: *size, *array --- \n"); return 0; } // 打印数组元素,返回值改为void void arrayElements(int array[], size_t size) { printf("\n --- Printing Elements of array --- \n"); for (int i = 0; i < size; i++) { printf("%d ", array[i]); } printf("\n"); } int main(void) { int *array = NULL; // 初始化为空指针,避免野指针 size_t size; if (createArray(&array, &size) != 0) { return 1; } arrayElements(array, size); // 记得释放分配的内存,避免内存泄漏 free(array); return 0; }
关键修改说明
- 内存分配:通过
*array = malloc(*size * sizeof(int))为主函数中的array指针分配内存,确保有合法的存储空间存放数组元素。 - 指针操作修正:用
(*array)[index]访问数组元素,先通过*array拿到数组的首地址,再通过下标访问对应位置。 - 输入校验:增加scanf返回值检查,以及malloc空指针检查,提升程序健壮性。
- 内存释放:主函数中使用
free(array)释放分配的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Raul Chiarella
相关产品推荐
相关产品推荐

