You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确访问经realloc动态调整大小的整型数组?

问题根源:运算符优先级错误

你触发栈溢出的核心原因是C语言的运算符优先级规则导致数组访问逻辑完全错误:

  • C语言中[]下标运算符的优先级高于*解引用运算符
  • 你写的*arrayOfInts[i - 1]实际执行逻辑是:
    1. 先对二级指针arrayOfInts做下标偏移:arrayOfInts[i - 1]
    2. 再对偏移后的指针做解引用
      而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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:54:04