您可以使用memcpy()
or strcpy()
,但您必须自己检查边界,并且代码中还有其他错误。
所以,我认为你想将一个 NSString 复制到一个char[16]
数组中。您可以使用NSString
内置方法来执行此操作,而不必memcpy()
自己使用:
NSString *src;
char dest[16];
NSUinteger destlen;
[src getBytes:dest
maxLength:sizeof(dest) - 1
usedLength:&destlen
encoding:NSUTF8StringEncoding
options:0
range:NSMakeRange(0, [src length])
remainingRange:NULL];
dest[destlen] = '\0';
如果你想使用memcpy()
,那么你必须这样做:
NSString *src;
char dest[16], *srcUtf8;
size_t len;
srcUtf8 = [src UTF8String];
len = strlen(srcUtf8);
if (len >= sizeof(dest))
len = sizeof(dest) - 1;
memcpy(dest, srcUtf8, len);
dest[len] = '\0';
代码中的错误
这段代码有两个错误!
memcpy(&profile.friendly_name, &string, 16); // Wrong!
首先,&string
是错误的。应该是string
,因为string
它是指向要复制的字符串数据的指针。如果你 copy &string
,你会得到一个指针和一些随机的堆栈数据位。换句话说,你会得到垃圾。
其次,16 是错误的。如果您知道这string
指向至少 16 个字节的数据,则只能复制 16 个字节。string
如果小于 16 个字节,内存中的以下数据不可读,这将导致分段错误(使您的程序崩溃) 。它今天可能不会崩溃,但也许它会在下周崩溃,你会忘记这一切吗?
这是错误的,除非您知道源至少有 16 个字节长,否则不要传递 16。