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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:42:00