为什么我的C数组代码没有按预期工作?

时间:2013-02-11 10:13:36

标签: objective-c

我在目标c中有一个指针,叫做:

 int *binary[20] ;

后来作为指针返回。

当我尝试使用以下内容为其分配编号时:

binary[5]=1;

我收到错误。

我知道binary指向来自20个单元格的第一个单元格的地址。 为什么我不能直接进入5号单元?

3 个答案:

答案 0 :(得分:1)

定义int* binary[20]定义了一个包含int的20个指针的数组。这真的是你想要的,或者你的意思是int binary[20]创建一个20 int的数组?

无论哪种方式,结果数组都存储在堆栈中,因此将指向此数组的指针返回给某些调用代码是错误的。 (返回调用代码后,堆栈被解除,为阵列保留的内存被标记为空闲。)  如果你想从调用代码中使用数组,你必须在堆上分配:

int *binary = calloc(20, sizeof(int));
binary[5] = 1; // fine, even after returning from this function

这将为您提供一个指向内存的指针,即使从函数返回后也可以使用该指针。 (调用者有责任使用free释放内存。)

无论如何,除非您有一些特定要求,否则应使用NSArray或类似的集合类。 Objective-C中的一般规则是尽可能使用高级API,直到被强制执行。在一般情况下,为几个整数分配NSArray是完全可以接受的。

答案 1 :(得分:0)

你已经声明了一个指针数组。

这意味着您可以在该阵列中存储20个内存地址。

但是binary[5]=1;你想要存储整数而不是int的地址。

您无法存储静态值等地址。

答案 2 :(得分:0)

您声明了指向整数的指针数组。您的类型为int *

如果您将类型更改为int,则可以使用:

int binary[20];
binary[5] = 1;

顺便说一下,你的Q与Objective-C无关,但与C有关。在Objective-C中,我们鼓励你尽可能地使用对象。 (NSArrayNSValue)。