Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么’;我的C数组代码不能按预期工作吗?_Objective C - Fatal编程技术网

Objective c 为什么’;我的C数组代码不能按预期工作吗?

Objective c 为什么’;我的C数组代码不能按预期工作吗?,objective-c,Objective C,我在目标c中有一个指针,叫做: int *binary[20] ; 它后来作为指针返回 当我尝试使用以下方式为其分配数字时: binary[5]=1; 我犯了一个错误 我知道binary指向20个单元格中第一个单元格的地址。 为什么我不能直接进入5号单元格?您已经声明了一个指针数组 这意味着您可以在该阵列中存储20个内存地址 但是通过binary[5]=1您要将整数存储在该地址中,而不是int地址 不能像静态值那样存储地址。您声明了指向整数的指针数组。您的类型是int* 如果将类型更改为i

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

 int *binary[20] ;
它后来作为指针返回

当我尝试使用以下方式为其分配数字时:

binary[5]=1;
我犯了一个错误

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

您已经声明了一个指针数组

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

但是通过
binary[5]=1您要将整数存储在该地址中,而不是int地址


不能像静态值那样存储地址。

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

如果将类型更改为
int
,它将工作:

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


顺便说一句,你的Q与Objective-C无关,但与C有关。在Objective-C中,鼓励你尽可能多地使用对象。(
NSArray
NSValue
)。

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

无论哪种方式,生成的数组都存储在堆栈上,因此将指向该数组的指针返回给某个调用代码都是错误的。(返回调用代码后,堆栈将展开,为数组保留的内存将标记为可用。) 如果要通过调用代码处理数组,则必须在堆上分配:

int *binary = calloc(20, sizeof(int));
binary[5] = 1; // fine, even after returning from this function
这将为您获取一个指向内存的指针,即使从函数返回后,该内存仍然可用。(调用者有责任使用
free
释放内存)


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

请注意
1
是一个有效的指针,因此他的原始代码工作正常。
1
不是有效的指针,除非关闭所有编译器警告。还编译!=我关闭了隐式整数到指针转换警告,这就是为什么我的编译器没有抱怨。此外,原始代码不仅可以编译,而且可以正常工作,除非指针返回到调用代码。(并不是说混淆指针和整数是个好主意。)
1
int
的有效地址,因此发布的代码应该可以工作。