在其他函数中使用指针的指针调用realloc扩容数组失败,求解决
问题分析与解决
你的代码核心问题出在运算符优先级上:[]的优先级高于*,所以*data[4]会被解析成*(data[4])——这相当于去访问data这个二级指针的第5个元素(直接越界),再解引用,完全不是你想要的操作。
正确的写法应该是(*data)[4],先通过*data拿到指向数组的一级指针,再用[4]访问数组的第5个元素。
修正后的完整代码:
#include <stdio.h> #include <stdlib.h> // 必须包含该头文件,malloc/realloc/free都依赖它 void push(int** data) { // 用临时变量接收realloc结果,避免分配失败时丢失原指针 int* temp = (int *)realloc(*data, 5 * sizeof(int)); if (temp == NULL) { fprintf(stderr, "内存分配失败\n"); exit(1); } *data = temp; (*data)[4] = 100; // 修正运算符优先级问题 } int main() { int *array = (int *)malloc(2 * sizeof(int)); if (array == NULL) { fprintf(stderr, "内存分配失败\n"); exit(1); } push(&array); printf("%d", array[4]); // 现在能正确输出100 free(array); return 0; }
额外补充两个关键细节:
- 务必包含
<stdlib.h>,否则内存操作函数的声明缺失会引发未定义行为。 - 不要直接将
realloc结果赋值给原指针,一旦分配失败返回NULL,会丢失原有内存地址造成泄漏,先用临时变量接收并校验。
内容的提问来源于stack exchange,提问作者Javad
相关产品推荐
相关产品推荐

