我有一个数组uint8_t arr[512]
,我需要在这个数组中存储一个字符串、IP 地址和一个 32 位数字。所以我想定义另一个字符串数组,如下所示。
uint8_t *ch[] = {
"abcd",
"1.1.1.1",
"123456782341223344445"
};
然后做一个memcpy
进入arr[512]
。这个可以吗?我想我可能无法从arr
. 请有任何其他想法。谢谢你的时间。
如果你想想指针数组是如何存储在内存中的,你就会明白为什么不能这样做。
您的字符串数组如下所示:
+-------+-------+--------+ | 通道[0] | 通道[1] | 通道[2] | +-------+-------+--------+ | | | | | v | | “A B C D” | v | “1.1.1.1” v “123456782341223344445”
因此,如果您memcpy
从ch
数组中执行 a 操作,您只会复制指针,而不是实际的字符串。
您当然可以将数组中的每个字符串分别复制到目标数组中,但这与将不相关的字符串分开并没有什么不同。
我不认为这是个好主意。更好地使用结构。
struct info
{
char* name;
char* address;
char* number; // or other type
}
pragma pack
如果要将完整结构复制到数组,可以使用。或使用诸如复制之类的东西来组合它们。
如果要将其复制到静态数组,则需要检查名称长度。
如果您memcpy()
将字符串包含在 terminating中ch[0]
,则可以这样做。你不能只是完整的数组。要从内部检索第二个字符串,您可以使用or :ch[2]
\0
memcpy()
ch
arr
strlen()
memchr()
char *ip = arr + strlen(arr) + 1;
或者
char *ip = memchr( arr, '\0', sizeof( arr ) ) + 1;
我个人更喜欢第一个选项,因为它更容易获得第三个字符串。
请注意,uint8_t arr[512]
这与uint8_t *ch[]
. 第一个是一个 512 字节的数组。第二个是指向字节的指针数组。你可能有严重的问题。因此,请帮助我们并告诉我们您真正想做的事情。