2

我这里有个小问题memcpy()

当我写这个

char ipA[15], ipB[15];
size_t b = 15;
memcpy(ipA,line+15,b);

它从第 15 个元素开始从数组中复制b字节line(很好,这就是我想要的)

memcpy(ipB,line+31,b);

b这从第 31 个元素开始的行中复制字节,它也将前一个命令的结果附加到它上面,即ipA.

为什么?ipB大小是 15,所以它不应该有足够的空间来复制其他任何东西。这里发生了什么事?

  • 结果ipA192.168.123.123
  • 结果ipB变成205.123.123.122 192.168.123.123

我哪里错了?我实际上不太了解 C 中的内存分配。

4

3 回答 3

6

看起来您没有在 ipA 中对字符串进行空终止。编译器已将两个变量并排放置在内存中,因此字符串操作假定第一个空终止符在第二个数组之后的某个时间(只要下一个0出现在内存中)。

尝试:

char ipA[16], ipB[16];
size_t b = 15;
memcpy(ipA,line+15,b);
ipA[15] = '\0';
memcpy(ipB,line+31,b);
ipB[15] = '\0';
printf("ipA: %s\nipB: %s\n", ipA, ipB)

这应该确认这是否是问题所在。显然,您可以使代码比我上面的测试代码更优雅。作为手动终止的替代方法,您可以使用printf("%.*s\n", b, ipA);或类似方法强制 printf 打印正确数量的字符。

于 2011-02-14T09:29:37.230 回答
2

您是否正在检查数组的内容printf("%s", ipA)?如果是这样,您将得到所描述的效果,因为您的数组被解释为一个非空终止的 C 字符串。改为这样做:printf("%.*s", sizeof(ipA), ipA)

于 2011-02-14T09:30:18.507 回答
0

C 中的字符串需要终止标记。它是 char 值0

由于您的两个字符串在内存中是连续的,如果您不终止第一个字符串,那么在读取它时,您将继续直到内存包含字符串结尾字符。

于 2011-02-14T09:30:18.590 回答