首先,请注意“null”这个词被重载了。可以有空指针和空(空)字符串,还有空字符('\0',转换为 int:((int)'\0') == 0 时等于 0)。还有一些未初始化的变量,它们可能为空,也可能不为空。我猜你说的是一个未初始化的字符数组,用作 c 字符串。
最有可能的是,hName 正在堆栈上分配(如果没有看到更多源代码,我无法判断),这意味着它是 not zero-initialized。实际上,hName 将保存最后存储在hName 占用的内存区域中的任何数据。您需要自己初始化它。
char hName[255] = {0};
// or
memset(hName, 0, sizeof(hName));
// or, if you have bzero
bzero(hName, sizeof(hName));
还要注意,由于hName 被声明为数组而不是指针,sizeof(hName) 是它存储的字符数。
void test() {
char *name1 = "";
char name2[255];
// All the following lines will be true
strlen(name1) == 0;
sizeof(name2) == 255
0 <= strlen(name2) && strlen(name2) < 255;
// pointers are 4 or 8 bytes on most machines these days
sizeof(name1) == 4 || sizeof(name1) == 8;
}
编辑(寻址代码示例):
getHost 中的str 的长度为 255,因为您在从 tTemp.hName 复制时告诉它具有该长度。 NSStrings 可以包含空值,尽管您可能难以打印它们和后面的任何字符。
从代码示例中不清楚 hName 是全局 (globals are bad) 还是属性。同样,haddr 和tTemp 等其他变量的范围也不清楚。其中一些应该是方法的参数。
名称“setHost”应保留给 setter——获取和设置属性的一对方法(Objective-C 用语中的“访问器”)中的一个。它们返回并(分别)采用一种理论上是属性类型的类型。在这种情况下,NSString* 最有意义;最好在代码中使用 NSString 并切换到(通过 NSString 的 cStringUsingEncoding: 或 UTF8String)。 -(void)setHost:(NSString*) 的合作伙伴将是 -(NSString*)host。
切换到 NSString(并使用 stringFromCString:withEncoding:)后,您可以简单地检查其长度或将其与 @"" 进行比较以检查是否存在空字符串。
@interface MyHost : NSObject {
NSString *name_;
...
}
/* post ObjC 2.0 */
@property(retain) NSString* name;
/* pre ObjC 2.0 */
-(NSString*)name;
-(void)setName:(NSString*);
/* any ObjC version */
-(int)setHostFromAddress:(MyAddress*)addr;
...
@end
@implementation MyHost
/* post ObjC 2.0 */
@synthesize name = name_;
-(int)setHostFromAddress:(MyAddress*)addr {
struct hostent *phost;
phost = gethostbyaddr(addr.address, addr.length, addr.type);
if (phost) {
self.name = [NSString stringWithCString:phost->h_hname encoding:NSASCIIStringEncoding];
}
return h_errno;
}
/* pre ObjC 2.0 */
-(NSString*)name {
return name_;
}
-(NSString*)setName:(NSString*)nom {
[name_ release];
name_ = [nom retain];
}
-(int)setHostFromAddress:(MyAddress*)addr {
struct hostent *phost;
phost = gethostbyaddr([addr address], [addr length], [addr type]);
if (phost) {
[self setName:[NSString stringWithCString:phost->h_hname encoding:NSASCIIStringEncoding]];
}
return h_errno;
}
...
@end