4

我已经阅读了一段时间,但我不确定我是否找到了一个好的答案。

我正在尝试设置一个由 92 个结构组成的数组。它是固定长度,不会改变,因为它实际上是一个查找表。我认为最好的方法是先分配内存,calloc然后加载数据。

但是经过一些阅读,我看到很多人直接分配内存而没有callocmalloc像这样

 myStruct myData[92] = { {1,2}, {3,4}, ....};

我的第一个问题是动态分配内存是否更好?我的理解是这是一个更好的解决方案。特别是如果数据不一定会一直被使用。

我的第二个问题是关于初始化数据。我读过我可以使用初始化结构,... = {....};但编译器不接受。

这是我到目前为止的代码:

typedef struct {
    int a;
    int b;
} myStruct;

@implementation MyClass

    static myStruct *myData;

    -(id) init {
         // ...

         myData = (myStruct *) calloc(92, sizeof(myStruct));
         myData[0] = {1,2}; // <=== Error ! Compiler says "Expected expression!"

         // ...
4

3 回答 3

5

您的代码看起来像 Objective-C,对吗?

如果您知道数组中有多少元素(并且它是一个健全的处理器和操作系统),那么显式定义它总是更简单。

每当您动态分配一个数组时,您都需要防止出现问题,这会使代码更难理解。

如果它真的是一个查找表,并且所有的值在编译时都是已知的,你可以初始化它:

struct {
    int a;
    int b;
} myStructDate[92] = { {1, 2}, {3, 4}, ... {181, 182}, {183, 184} };
于 2012-03-18T04:14:27.363 回答
3

关于问题1:静态分配数组应该没问题。该数组将存储在二进制文件的数据部分中,将被加载到进程的虚拟内存中,并在必要时由操作系统换出,就像您的进程正在使用的任何其他内存一样。它还可以在访问数据时节省时间,因为您不需要分配和初始化它。

关于问题 2:gcc 至少不喜欢这样初始化数组元素。但是您可以使用临时变量作弊:

myStruct s = {1,2};
myData[0] = s;

我不太确定标准对此有何规定。

于 2012-03-18T04:10:07.857 回答
2

因为这不是初始化,所以您需要进行分配

myData[0].a = 1;
myData[0].b = 2;

您可以像本示例一样在初始化它时使用 {} 初始化,这也会设置您的数组。这有点浪费,因为如果您使用上述方法,则不需要 temp 变量。

myStruct temp = {1,2};
myStruct* myData = (myStruct *) calloc(92, sizeof(myStruct));
myData[0] = temp;

关于何时在堆上分配内存(通过 malloc/calloc)的一个很好的经验法则是,如果您需要在函数之外使用它。否则,您可能应该在堆栈上执行此操作(使用局部变量)。

于 2012-03-18T04:10:38.923 回答