2

我有一个数组uint8_t arr[512],我需要在这个数组中存储一个字符串、IP 地址和一个 32 位数字。所以我想定义另一个字符串数组,如下所示。

uint8_t *ch[] = {
     "abcd",
     "1.1.1.1",
     "123456782341223344445"
};

然后做一个memcpy进入arr[512]。这个可以吗?我想我可能无法从arr. 请有任何其他想法。谢谢你的时间。

4

4 回答 4

4

如果你想想指针数组是如何存储在内存中的,你就会明白为什么不能这样做。

您的字符串数组如下所示:

+-------+-------+--------+
| 通道[0] | 通道[1] | 通道[2] |
+-------+-------+--------+
   | | |
   | | v
   | | “A B C D”
   | v
   | “1.1.1.1”
   v
   “123456782341223344445”

因此,如果您memcpych数组中执行 a 操作,您只会复制指针,而不是实际的字符串。


您当然可以将数组中的每个字符串分别复制到目标数组中,但这与将不相关的字符串分开并没有什么不同。

于 2013-07-22T10:56:15.517 回答
2

我不认为这是个好主意。更好地使用结构。

struct info
{
  char* name;
  char* address;
  char* number; // or other type
}

pragma pack如果要将完整结构复制到数组,可以使用。或使用诸如复制之类的东西来组合它们。

如果要将其复制到静态数组,则需要检查名称长度。

于 2013-07-22T11:02:29.797 回答
0

如果您memcpy()将字符串包含在 terminating中ch[0],则可以这样做。你不能只是完整的数组。要从内部检索第二个字符串,您可以使用or :ch[2]\0memcpy()charrstrlen()memchr()

char *ip = arr + strlen(arr) + 1;

或者

char *ip = memchr( arr, '\0', sizeof( arr ) ) + 1;

我个人更喜欢第一个选项,因为它更容易获得第三个字符串。

于 2013-07-22T10:56:26.980 回答
0

请注意,uint8_t arr[512]这与uint8_t *ch[]. 第一个是一个 512 字节的数组。第二个是指向字节的指针数组。你可能有严重的问题。因此,请帮助我们并告诉我们您真正想做的事情。

于 2013-07-22T10:57:40.493 回答