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
相关产品推荐
相关产品推荐

