如何正确访问经realloc动态调整大小的整型数组?
问题根源:运算符优先级错误
你触发栈溢出的核心原因是C语言的运算符优先级规则导致数组访问逻辑完全错误:
- C语言中
[]下标运算符的优先级高于*解引用运算符 - 你写的
*arrayOfInts[i - 1]实际执行逻辑是:- 先对二级指针
arrayOfInts做下标偏移:arrayOfInts[i - 1] - 再对偏移后的指针做解引用
而arrayOfInts本身是指向main函数中单个一级指针变量的二级指针,只有1个指针大小的合法栈空间,当i>=2时,i-1 >=1,偏移后的地址已经超出了arrayOfInts的合法访问范围,直接触发栈缓冲区溢出。
- 先对二级指针
修复方案
只需要给解引用操作加括号,保证先拿到数组首地址再取下标即可:
#include <stdlib.h> void reallocFail(int **arrayOfInts) { *arrayOfInts = (int *)malloc(sizeof(int)); for (int i = 1; i <= 10; i++) { *arrayOfInts = (int *)realloc(*arrayOfInts, (i) * sizeof(int)); // 修正:加括号保证先解引用二级指针拿到数组首地址,再取下标 (*arrayOfInts)[i - 1] = i; } } int main(void) { int *arrayOfInts; reallocFail(&arrayOfInts); // 补充:使用完后记得释放内存避免泄漏 free(arrayOfInts); return 0; }
额外优化建议
- 不要直接把
realloc的返回值赋值给原指针:如果realloc申请内存失败会返回NULL,直接赋值会覆盖原指针地址,导致已申请的内存泄漏。建议先用临时变量接收realloc返回值,判断非空后再赋值给原指针。 malloc/realloc的返回值在C语言中不需要强制转换为int*,隐式转换即可正常工作。
内容的提问来源于stack exchange,提问作者rxtt_22
相关产品推荐
相关产品推荐

