从C为Obj-C结构赋值

时间:2012-03-13 22:11:56

标签: c++ objective-c c objective-c++

我在头文件中声明我的结构如下:

typedef struct MyStruct{
    int test;
} MyStruct;

@interface StructTestingFile
MyStruct *originalStruct;
@end

然后从.mm文件中调用

originalStruct = loadTestInt();

在C文件中,这是我正在做的事情:

extern "C" MyStruct* loadTestInt()
{
    MyStruct *aStruct;

    aStruct->test = 1;

    return aStruct;
}

每次在分配aStruct->test = 1时崩溃。我做错了什么?

3 个答案:

答案 0 :(得分:4)

您正在创建指针但不为结构本身分配内存;

MyStruct *aStruct;

aStruct = (MyStruct*)malloc(sizeof(MyStruct));

aStruct->test = 1;

答案 1 :(得分:2)

取消引用未初始化的指针会导致未定义的行为。执行该任务时aStruct并未指出任何内容。分配一些空间,你将参加比赛:

extern "C" MyStruct* loadTestInt()
{
  MyStruct *aStruct = malloc(sizeof(MyStruct));
  aStruct->test = 1;
  return aStruct;
}

答案 2 :(得分:2)

到目前为止,其他答案都指出了使用指针而不是分配内存的错误。

但是你真的想要使用指向你的结构的指针吗? struct是一个值类型(C-ese中的POD),你可以像传递一样整数来传递它们。除非您的结构很大,或者 identity 很重要(使用identity表示两个指针指的是完全相同的内存),动态分配结构可能只是您不需要的工作 - 尤其是当您以后必须释放它。

为了比较,这里是没有指针的代码:

typedef struct MyStruct
{
   int test;
} MyStruct;

@interface StructTestingFile
{
   MyStruct originalStruct;
}
@end

extern "C" MyStruct loadTestInt()
{
   MyStruct aStruct;

   aStruct.test = 1;

   return aStruct;
}