gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:37:26 25 4
gpt4 key购买 nike

我正在努力实现一些低级文件写入,其中文件格式特定于每个位。我需要将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com