0

我在这里问这个问题之前做了广泛的研究,但我找不到答案。

我有一个简单的结构,其中包含另一个结构的数组和总数:

typedef struct {
    int total;
    struct Struct1 arrayOfStructs[];
} Struct2;
Struct2 _myVar;  // the variable I need
  • arrayOfStructs[]应该是包含类型结构的 C 数组Struct1(此语法无效,因为您需要一个常量值)
  • total是的计数arrayOfStructs
  • Struct1不相关,它只包含一些原始数据)

问题是我希望这个数组是动态的。我希望能够做到这一点:

for (int i = 0; i < _myVar.total; i++) {
    NSLog(@"%d", _myVar.arrayOfStructs[i].index);
}

我尝试了以下方法:

typedef struct {
    int total;
    struct Struct1 *arrayOfStructs;  // USING A POINTER HERE
} Struct2;
Struct2 _myVar;  // the variable I need

并添加值:

int total = ++_myVar.total;  // increase total count
_myVar.arrayOfStructs = realloc(_myVar.arrayOfStructs, total * sizeof(Struct1));
_myVar.arrayOfStructs[total - 1] = {1, 5.3};  // appending a new value in the array

上面的代码正确地添加了值,但是在将它传入NSData并检索它之后,数组项丢失了,我最终得到了一些错误的指针:

[NSData dataWithBytes:&_myVar length:sizeof(_myVar) + sizeof(Struct1) * total];

我怀疑这是因为我需要做sizeof(_myVar) + sizeof(Struct1) * total的不仅仅是sizeof(_myVar),所以由于指针地址不同,我最终得到了错误的数据。我认为我没有将数据正确复制到我的结构中。
任何帮助将不胜感激!

4

4 回答 4

2

需要单独编写Struct1的内容:

myData = [NSMutableData dataWithBytes:&_myVar length:sizeof(_myVar)];
[myData appendBytes: _myVar.arrayOfStructs length: (_myVar.total * sizeof(Struct1)];

回读的时候,需要读它的第一部分,忽略你读到的arrayOfStructs的值,根据长度重新分配,剩下的部分读入新分配的指针。

于 2013-03-20T22:23:31.853 回答
1

_myVar 是一个 Struct2 变量。所以它只有一个整数和一个指针。结构数组不属于 _myVar。

因此,NSData 的长度存在错误。在 &_myVar 中只有一个大小为 sizeof(Struct2) 的结构。

于 2013-03-20T22:17:19.073 回答
1

在 C 中,通常在结构的末尾使用大小为 1 的数组。不知道它是否在 Objective-C 中是标准的。重新分配

(total- 1) * sizeof(Struct1) + sizeof(Struct2)

可能工作。

我认为。

编辑:

我的意思是,您可以执行以下操作:

这将是你的结构:

typedef struct {
    int total;
    struct Struct1 arrayOfStructs[1];
} Struct2;
Struct2 *_myVar = malloc(sizeof(Struct2));

这就是添加元素的方式:

int total = ++_myVar->total;
realloc(_myVar, (total - 1) * sizeof(Struct1) + sizeof(Struct2));
_myVar->arrayOfStructs[total - 1] = {1, 5.3};

或类似的东西

于 2013-03-20T22:21:49.080 回答
0

跟踪数组中的元素数量。要添加孩子,请重新 calloc、memcpy,并将孩子设置在数组中。

typedef struct Person {
    char *name;
    short age;
    struct Person *children;
    int numberOfChildren;
} Person;


#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
    @autoreleasepool {

        NSData *data;
        {
            // setup Carol
            Person ethan = { .name="Ethan", .age=14, .children=nil, .numberOfChildren=0 };
            Person terry = { .name="Terry", .age=16, .children=nil, .numberOfChildren=0 };
            Person carol = { .name="Carol", .age=40, .children=nil, .numberOfChildren=2 };
            carol.children=(Person  *)calloc(carol.numberOfChildren, sizeof(&carol));
            carol.children[0] = ethan;
            carol.children[1] = terry;

            // people
            Person  *people = (Person  *)calloc(1+carol.numberOfChildren, sizeof(*people));
            people[0] = carol;

            size_t bytesToCopy = 1+carol.numberOfChildren * sizeof(*people);
            data = [NSData dataWithBytes:people length:bytesToCopy];
        }

        {
            int elements = 1 + [data length]/sizeof(Person);
            Person  *people = (Person  *)calloc(elements, sizeof(*people));
            size_t bytesToCopy = [data length];
            const void *source = [data bytes];
            memcpy((void*)people, source, bytesToCopy); // memxxx are an ARC no-no

            for (int i = 0; i < 1; i=i+people[i].numberOfChildren) {
                printf("\nname=%s, age=%d, children=%d", people[i].name, people[i].age, people[i].numberOfChildren);
                for (int j = 0; j < people[i].numberOfChildren; j++) {
                     printf("\nname=%s, age=%d, children=%d", people[i].children[j].name, people[i].children[j].age, people[i].children[j].numberOfChildren);
                }
            }
        }

    }
}

印刷

name=Carol, age=40, children=2
name=Ethan, age=14, children=0
name=Terry, age=16, children=0

考虑避免所有这些并切换到对象。

于 2013-03-20T23:54:08.937 回答