【问题标题】:How to properly declare/initialize/finalize dynamic array of structs with other dynamic arrays如何使用其他动态数组正确声明/初始化/完成动态结构数组
【发布时间】:2017-11-30 22:39:55
【问题描述】:

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

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

/*** "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;
    }
}

但显然这只是一堆废话,而不是适当的代码......

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

【问题讨论】:

  • 好吧 C 然后我提到我不在乎 C/C++
  • 您发布的是 C++ 代码。没有“C/C++”之类的东西。
  • 你只是在寻找类似int *A2 = new int[n]的东西吗?
  • IDE(例如 Visual Studio)接受 C 和 C++。我错了吗?
  • 我会说英语和拉丁语。这并不意味着它们是同一种语言。

标签: c arrays struct dynamic-arrays


【解决方案1】:

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

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

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

应该是

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

并且不需要创建指向数组的指针,因为数组已经是指针lol

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

但我认为的整个逻辑似乎是合法的,并且运行良好。即使我没有测试我的项目是否存在内存泄漏,但当我使用终结程序时,它似乎可以毫无问题地释放分配的内存......

【讨论】:

  • 数组不仅仅是“指向第一个元素的指针”。但是你是正确的,处理动态调整数组的最佳方法是使用指向第一个元素的指针,而不是你尝试的数组 typedefs
  • 好吧,我想这不是数组在内部是指针,但从程序员的角度来看,它们似乎是通过编程...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 2013-09-10
  • 1970-01-01
  • 2020-11-09
  • 2021-06-21
  • 2020-12-04
  • 1970-01-01
相关资源
最近更新 更多