第二个memcpy()将以前的memcpy()数组附加到它

con*_*sed 2 c memcpy

我这里有一点问题 memcpy()

当我写这个

char ipA[15], ipB[15];
size_t b = 15;
memcpy(ipA,line+15,b);
Run Code Online (Sandbox Code Playgroud)

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

memcpy(ipB,line+31,b);
Run Code Online (Sandbox Code Playgroud)

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

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

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

我哪里错了?我实际上并不知道很多关于C中的内存分配.

DrA*_*rAl 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)
Run Code Online (Sandbox Code Playgroud)

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

  • OP的帖子实际上没有说明ipA和ipB包含字符串,即使它看起来很有可能.如果它们确实包含字符串,则可以使用strpcy()代替memcpy().strcpy()的优点是,如果您忘记了null终止,它很可能会导致主要的运行时崩溃. (2认同)