C语言中将二维数组行地址存入一维数组后无法正确指向原值问题
问题根因与解决方案
根因说明
你保存的是栈上局部变量的地址,当func函数执行返回后,局部变量matrix的内存空间会被操作系统回收,此时再通过之前保存的地址访问属于未定义行为,自然无法读取到原始值。
- func执行过程中,
matrix被分配在当前函数的栈帧上,打印出的地址是该栈帧内的有效地址,地址传递过程本身没有错误 - func返回后,对应栈帧被弹出,原
matrix占用的内存区域会被后续操作覆盖,或被标记为不可访问,因此访问结果不符合预期
适配Python调用的解决方案
如果你需要保存地址供后续跨语言调用使用,可选择以下三种方案:
方案1:使用静态存储数组
将matrix定义为静态变量,静态变量的生命周期覆盖整个程序运行周期,不会随函数返回销毁,适合矩阵内容固定的场景:
void func(uint64_t* pkt) { static uint8_t matrix[3][3] = { {3, 7, 4}, {1, 2, 8}, {8, 3, 2} }; for (int i = 0; i < 3; i++) { pkt[i] = (uintptr_t)matrix[i]; printf("The address is %p\n", matrix[i]); printf("The address is %p\n", (void*)pkt[i]); } }
注意:静态变量为全局共享,多次调用func会覆盖原有内容。
方案2:堆上动态分配内存
如果矩阵内容需要每次调用func动态生成,使用malloc分配堆内存,堆内存的生命周期由开发者手动控制,直到调用free前均为有效:
#include <stdlib.h> void func(uint64_t* pkt) { uint8_t (*matrix)[3] = malloc(sizeof(uint8_t) * 3 * 3); // 初始化矩阵 matrix[0][0] = 3; matrix[0][1] = 7; matrix[0][2] = 4; matrix[1][0] = 1; matrix[1][1] = 2; matrix[1][2] = 8; matrix[2][0] = 8; matrix[2][1] = 3; matrix[2][2] = 2; for (int i = 0; i < 3; i++) { pkt[i] = (uintptr_t)matrix[i]; printf("The address is %p\n", matrix[i]); printf("The address is %p\n", (void*)pkt[i]); } }
注意:使用完矩阵(包括Python侧调用结束)后,需要手动释放对应堆内存,避免内存泄漏。
方案3:主函数定义矩阵作为参数传入
将矩阵的生命周期与main函数绑定,在main中定义矩阵后作为参数传入func,不存在函数返回后内存被回收的问题:
// main函数中新增矩阵定义 uint8_t matrix[3][3]; func(pkt, matrix); // func函数修改为如下实现 void func(uint64_t* pkt, uint8_t matrix[3][3]) { // 初始化矩阵 matrix[0][0] = 3; matrix[0][1] = 7; matrix[0][2] = 4; matrix[1][0] = 1; matrix[1][1] = 2; matrix[1][2] = 8; matrix[2][0] = 8; matrix[2][1] = 3; matrix[2][2] = 2; for (int i = 0; i < 3; i++) { pkt[i] = (uintptr_t)matrix[i]; } }
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

