如何使用其他动态数组正确声明/初始化/完成动态结构数组

时间:2017-11-30 22:39:55

标签: c arrays struct dynamic-arrays

所以我想要实现的是全局变量,它表示结构的动态数组的指针,其中包含其他指向内部动态数组的指针。

所以我已经在头文件中声明了所有内容:

/*** "GLOB.h" ***/

//Dynamic Array of fixed Arrays of 4 floats each
typedef float DArray1[][4];

//Dynamic Array of Integers
typedef int DArray2[];

//Struct
struct MyStruct
{
    //pointer to DArray1
    DArray1 * A1;
    //pointer to DArray2
    DArray2 * A2;
    //Length of A1 and A2
    int len = 1;
    //Some other simple elements of fixed size
};

//Dynamic Array of Structs
typedef MyStruct DAStructs[];

namespace GLOB
{
    //pointer to DAStructs
    extern DAStructs * SS;
    //Few other simple variables initialized in place
};

因为我不确定我是否正确地宣布了一切 - 首先问题是:如何在C / C ++中声明这样的数据结构?

第二个(+第三个)是:如何正确地初始化并用一些可变长度来完成它?

我想初始化和终结应该是这样的:

#include "GLOB.h"

namespace GLOB
{
    void Init_SS(int len) {
        SS = new MyStruct*[len];
        for(int k=0; k<len; k++){
            SS[k].A1 = new float*[1][4];
            for(int j=0; j<4; j++) SS[k].A1[0][j] = 0.0;
            SS[k].A2 = new int*[1];
            SS[k].A2[0] = 0;
        }
    }
    void Fin_SS() {
        int len = length(SS);
        for(int k=0; k<len; k++){
            delete [] SS[k].A1;
            delete [] SS[k].A2;
        }
        delete [] SS;
    }
}

但显然它只是一堆废话而不是合适的代码......

P.S。我宁愿避免使用或任何其他解决方案,因为我想首先学习,其次我需要尽可能多地控制元素将如何放置在内存中,因为以后我需要将指针传递给从DLL导入的其他函数的结构...

1 个答案:

答案 0 :(得分:0)

没有人回答,但实际上答案很简单,因为我做的一切几乎都是正确的=)

我的第一个(也是主要的)错误是我忘了C中的数组只是第一个元素的指针,所以不是

typedef float DArray1[][4];
typedef int DArray2[];
typedef MyStruct DAStructs[];

应该是

typedef float (*DArray1)[4];
typedef int * DArray2;
typedef MyStruct * DAStructs;

并且不需要指向数组,cuz数组已经是指针lol

我的第二个错误是我忘记了(好吧,这不是我知道它=)C中的数组长度没有存储在任何地方,所以它应该是另一个变量,其中长度应该手动存储分配后。

但是我认为的整个逻辑似乎是合法的,并且它运作良好。即使我没有测试我的项目的内存泄漏,当我使用完成程序时,它似乎释放分配的内存没有任何问题......