1

我对我发现的一些行为进行了一些测试,我想知道是否有人可以帮助我了解发生了什么。

我有一个名为 的结构myStruct,它看起来像这样:

typedef struct {
    int size;
    float floats[];
} myStruct;

我在上面运行这段代码:

int main () {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSArray *a = [[NSArray alloc] initWithObjects:@"0.2", @"0.5", @"0.5", nil];

    NSLog(@"%@", a);

    myStruct my;
    my.size = a.count;

    my.floats[0] = [[a objectAtIndex:0] floatValue];
    my.floats[1] = [[a objectAtIndex:1] floatValue];
    my.floats[2] = [[a objectAtIndex:2] floatValue];

    NSLog(@"{ %lf, %lf, %lf }", my.floats[0], my.floats[1], my.floats[2]);

    [a release];    
    [pool drain];
    return 0;
}

它工作正常。但是,当我将结构声明更改为此:

typedef struct {
    float myVar;
    int size;
    float floats[];
} myStruct;

当我拨打该线路时,我得到 EXEC_BAD_ACCESS [a release]

谁能帮我理解这里发生了什么?

4

2 回答 2

4

您必须为灵活的数组成员实际分配空间!这一行:

myStruct my;

size仅为(或从您myVarsize第二个示例)腾出足够的堆栈空间。看来,在您失败的情况下,您正在覆盖a堆栈,但实际上这两种情况都是错误的。要解决您的问题,您需要为floats[]结构的成员分配空间:

myStruct *my = malloc(sizeof(myStruct) + a.count * sizeof(float));

完成后不要忘记free()它!

一个简单的例子 - 这个程序:

#include <stdio.h>

typedef struct {
    float myVar;
    int size;
    float floats[];
} myStruct;

int main(int argc, char **argv)
{
  printf("%zu\n", sizeof(myStruct));
  return 0;
}

及其输出:

$ make testapp
cc     testapp.c   -o testapp
$ ./testapp 
8
于 2011-02-15T17:38:57.863 回答
2

你没有为你的花车分配任何内存——我很惊讶它没有早点崩溃!

您是否需要为 floats[] 指针分配一些内存?


经过快速测试后,我得到了 myStruct 的两个定义的 EXC_BAD_ACCESS :)

于 2011-02-15T17:37:37.553 回答