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

C语言通过二级指针传参调用realloc分配内存后写入触发段错误求助

问题原因

你遇到的崩溃是运算符优先级错误导致的非法内存访问:
C语言中,下标运算符[]的优先级高于解引用运算符*,你写的*m[1]的实际执行逻辑是*(m[1]),而非你预期的(*m)[1]。

  • m是二级指针,存储的是main函数中memory变量的地址,只有m[0]是合法可访问的地址,m[1]是m指针向后偏移一个指针长度的未知非法内存
  • 你对m[1]解引用操作直接访问了非法地址,因此触发段错误

你之前写的*m[0]恰好可以正常运行,是因为*(m[0])等价于(*m)[0],只是运算逻辑刚好巧合得到正确地址,不属于规范写法。

修正方案

对解引用操作加括号明确优先级即可,同时补充realloc的最佳实践,避免分配失败导致原指针丢失内存泄漏:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>


void foo(uint64_t** m)
{
        // 用临时指针接收realloc返回值,分配失败也不会丢失原指针
        uint64_t* tmp = realloc(*m, sizeof(uint64_t) * 4);
        if (tmp == NULL) {
            perror("内存分配失败");
            return;
        }
        *m = tmp;

        (*m)[0] = (uint64_t)1;
        (*m)[1] = (uint64_t)2;
        (*m)[2] = (uint64_t)3;
        (*m)[3] = (uint64_t)4;
}


int main()
{
        uint64_t* memory = NULL;

        foo(&memory);

        for(int i = 0; i < 4; i++)
                printf("%d = %ld\n", i, memory[i]);
        
        free(memory);
        return 0;
}

内容的提问来源于stack exchange,提问作者Katoptriss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:27:02