objective-c - memcpy 会正确复制字符串吗?

标签 objective-c c nsstring memcpy strcpy

我正在努力实现一些低级文件写入,其中文件格式特定于每个位。我需要将 NSString 中的字符串复制到长度为 16 的以空字符结尾的字符串中(根据 Xcode,这是不可分配的)。对于 c,我是一个完全 n00b 的人,我想确保我理解正确。这就是我目前正在做的事情:

//I have a non-null NSString called _friendly_name.
const char *string = [_friendly_name UTF8String];
//profile.friendly is a utf-8 null-terminated string
memcpy(&profile.friendly_name, &string, 16);

这还没有经过测试,但我想确保它会起作用。这会提供我期望的行为吗?或者我应该以不同的方式复制字符串(例如 strcpy)?

最佳答案

您可以使用 memcpy()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是指向要复制的字符串数据的指针。如果您复制&string ,您将得到一个指针和一些随机复制的堆栈数据位。换句话说,你会得到垃圾。

其次,16 是错误的。如果知道 string,则只能复制 16 个字节指向至少 16 个字节的数据。如果 string,这将导致段错误(使您的程序崩溃,很难)小于 16 字节内存中的以下数据不可读。它今天可能不会崩溃,但可能下周就会崩溃,而你会忘记这一切吗?

错了,除非你知道源至少有 16 个字节长,否则不要传递 16。

关于objective-c - memcpy 会正确复制字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946723/

相关文章:

c - 如何识别traceroute包?

c - 无法读取 C 中的 UNICODE 文本文件

c - 添加 2 个 double 并打印它们

ios - 获取 NSString 中的相似字符

ios - IBOutlet nil 一切看起来都正常

objective-c - 应用程序终止时泄漏

ios - 如何将 char 数组的一部分转换为 NSString*?

ios - 从 NSString 获取常用字符作为子字符串

objective-c - 如何知道 iPhone 用户 SIM 卡是否已更改?

objective-c - NS_ENUM 对象在添加到桥接头文件后无法编译