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