Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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对象的C数组_Objective C_C_Malloc - Fatal编程技术网

Objective c 目标C对象的C数组

Objective c 目标C对象的C数组,objective-c,c,malloc,Objective C,C,Malloc,我正在尝试使用malloc创建一个目标NSC字符串的C数组。我做得不对,但我认为我已经走得不远了。也许有人能给我指出正确的方向。 假设为了参数起见,数组中需要5个字符串 接口: @interface someObject : NSObject { NSString **ourArray; } @property () NSString **ourArray; @end 实施: @implementation someObject @synthesize ourArray; -(id)

我正在尝试使用malloc创建一个目标NSC字符串的C数组。我做得不对,但我认为我已经走得不远了。也许有人能给我指出正确的方向。 假设为了参数起见,数组中需要5个字符串

接口:

@interface someObject : NSObject {
    NSString **ourArray;
}
@property () NSString **ourArray;
@end
实施:

@implementation someObject
@synthesize ourArray;

-(id)init {
    if((self = [super init])) {
        self->ourArray = malloc(5 * sizeof(NSString *));
    }
    return self;
}

-(NSString *)getStringAtPos3 {
    if(self.ourArray[3] == nil) {
        self.ourArray[3] = @"a string";
    }
    return self.ourArray[3];
}
@end

当我在getStringAtPos3中设置断点时,它不会将数组元素视为nil,因此它永远不会进入if语句。

我发现了问题所在-我应该使用calloc,而不是malloc。虽然malloc只是分配内存,但calloc

连续为count对象分配足够的空间,每个对象的大小为内存字节,并返回指向已分配内存的指针。分配的内存由值为零的字节填充


这意味着您将获得一个nil对象数组,基本上就像在objective c中0x0是nil对象一样。

我解决了问题-我应该使用calloc,而不是malloc。虽然malloc只是分配内存,但calloc

连续为count对象分配足够的空间,每个对象的大小为内存字节,并返回指向已分配内存的指针。分配的内存由值为零的字节填充

这意味着您将获得一个nil对象数组,基本上就像在目标c中0x0是nil对象一样。

一个问题是:

self->ourArray = malloc(5 * sizeof(NSString *));  // notice the sizeof()
一个问题是:

self->ourArray = malloc(5 * sizeof(NSString *));  // notice the sizeof()

malloc
ing指针数组的操作如下:

self->ourArray = malloc(5 * sizeof(NSString *));
if (self->ourArray == NULL)
    /* handle error */
for (int i=0; i<5; i++)
    self->ourArray[i] = nil;

malloc
ing指针数组的操作如下:

self->ourArray = malloc(5 * sizeof(NSString *));
if (self->ourArray == NULL)
    /* handle error */
for (int i=0; i<5; i++)
    self->ourArray[i] = nil;


不,不是这个意思。可能令人困惑的是,空指针不一定都是零,这就是
calloc
提供给您的。(它在i386上,但决不依赖它。)显式地将所有元素设置为null,并按照@chrisaycock的建议添加
sizeof
。嗯,我不这么认为,larsmans。C99第6.3.2.3节,“值为0的整数常量表达式,或转换为void*类型的表达式,称为空指针常量。”和“宏null在(和其他标题)中定义为空指针常量;请参见7.17。”。7.17将NULL指定为“扩展为实现定义的NULL指针常量”的宏。因此,NULL在不同的实现中可以是0或(void*)0,但不能是1。@但这两个都是常量表达式@larsmans的观点是正确的,即不能保证
NULL
将在内部用所有零位表示。也就是说,它在iOS/OS X上,对于那些系统来说依赖它是相当安全的。不过0x0是nil对象,所以如果calloc将指针分配为一组零,那么它肯定是nil对象吗?不管怎样,在i386和arm上使用calloc都是有效的。+1对于Justin:这条规则只适用于指针类型的常量表达式,而
calloc
写入字节类型的零。在这种情况下,编译器会将0转换为当前平台的正确空指针。依赖null为全零是不可移植的,如果应用程序移动到其他平台,它可能会中断应用程序。不,这不是它的意思。可能令人困惑的是,空指针不一定都是零,这就是
calloc
提供给您的。(它在i386上,但决不依赖它。)显式地将所有元素设置为null,并按照@chrisaycock的建议添加
sizeof
。嗯,我不这么认为,larsmans。C99第6.3.2.3节,“值为0的整数常量表达式,或转换为void*类型的表达式,称为空指针常量。”和“宏null在(和其他标题)中定义为空指针常量;请参见7.17。”。7.17将NULL指定为“扩展为实现定义的NULL指针常量”的宏。因此,NULL在不同的实现中可以是0或(void*)0,但不能是1。@但这两个都是常量表达式@larsmans的观点是正确的,即不能保证
NULL
将在内部用所有零位表示。也就是说,它在iOS/OS X上,对于那些系统来说依赖它是相当安全的。不过0x0是nil对象,所以如果calloc将指针分配为一组零,那么它肯定是nil对象吗?不管怎样,在i386和arm上使用calloc都是有效的。+1对于Justin:这条规则只适用于指针类型的常量表达式,而
calloc
写入字节类型的零。在这种情况下,编译器会将0转换为当前平台的正确空指针。依赖null为全零是不可移植的,如果应用程序移动到其他平台,可能会中断应用程序。无需使用
self->
。如果你这样做的话,它将给旧的hat ObjC开发人员提供配置单元。还要注意,指向Objective-C对象的指针的C数组是一种非常非典型的模式。只需使用
NSArray
nspointerray
即可。使用
self->
有什么坏处?另外,我正在为iOS开发,它没有
NSPointerArray
,但我想要一个动态大小的数组,可以有空条目。据推测,C数组速度也更快,不过在这种情况下不会有太大区别。不需要使用
self->
。如果你这样做的话,它将给旧的hat ObjC开发人员提供配置单元。还要注意,指向Objective-C对象的指针的C数组是一种非常非典型的模式。只需使用
NSArray
nspointerray
即可。使用
self->
有什么坏处?另外,我正在为iOS开发,它没有
NSPointerArray
,但我想要一个动态大小的数组,可以有空条目。大概C数组也更快了,不过在这种情况下不会有太大的区别。是的,我只是在这里输入了示例,但错过了,谢谢。是的,我只是在这里输入了示例,错过了,谢谢。那么最好使用malloc还是calloc呢?calloc会返回所有nil对象。
calloc
可能会返回平台上的所有
nil
-对象,但不保证这一点;这是巧合。这是很好的风格