c - 在声明函数之外访问二维数组中的结构

标签 c memory-management malloc

我正在尝试访问我创建的返回的二维结构数组。我可以在创建它们的函数中访问它们,但当我传递它时似乎丢失了引用。 我已经厌倦了一千种方法,但似乎没有什么区别。 总是出现段错误。

我当前的运行情况如下:

一个简单的结构:

typedef struct{
    int weight;
} myStruct_t;

为 myStruct_t 创建二维数组的函数。 我当前的尝试是创建一个新变量作为指向“map”的指针,如最后两行所示。

myStruct_t*** makeGrid(int sizeX, int sizeY)
{  
    int i;

    myStruct_t **map = malloc(sizeX * sizeof(*map));  

    if(map == NULL){
        printf("Unable to set memory, Exiting\n");
        exit(1);
    }else{  
        for ( i = 0; i < sizeX; i++)
        {
            map[i] = malloc(sizeY*sizeof(myStruct_t));

            if(map[i] == NULL)
            {
                printf("Unable to set memory, Exiting\n");
                exit(1);
            }else{
                printf("success!\n");
            }
        }
    }

    myStruct_t ***mapPtr = &map;
    return mapPtr;  
}  

然后在另一个文件中:

void initSys(){
    myStruct_t** map = *myStruct_t(100,100);    
    map[0][0].weight = 7;

   //or i also just tried
   //myStruct_t*** map = myStruct_t(100,100);
   //(*map)[0][0].weight = 7;

}

输出是一个SegFault。 令人惊讶的是,我很快就完全忘记了 C 内存管理,而且我似乎无法将其恢复!

任何建议都会很棒。

最佳答案

bug已上线

myStruct_t ***mapPtr = &map;

应该是:

 return map;

您需要将返回类型更改为双指针。

当您返回“&map”时,您将返回变量map的地址。由于变量 map 存储在堆栈中,因此您将返回无效内存的地址。

关于c - 在声明函数之外访问二维数组中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14907977/

相关文章:

c - 运算符 -> 在 malloc 函数中

c - 来自 "The C Programming Language"的代码如何工作?

java can system out 导致内存不足问题

c - C 中的 snprintf 问题

memory-management - 了解 Instruments 和 All Heap & Anonymous VM

c++ - VirtualFree 是否解锁 VirtualLock?

c - c中指针的内存分配

c++ - ioctl bug 在 SPI 传输函数中返回 -1 EINVAL

c - 现有的C语言源代码如何使用 'OpenCppCoverage'?

c - 如何禁用 gcc 警告 "cc1: warning: command line option ‘-std=c++11’ 对 C++/ObjC++ 有效但对 C 无效 [默认启用]”