C 奇怪的数组行为

标签 c arrays memcpy memset

在了解到 strncmp 不是它看起来的样子并且 strlcpy 在我的操作系统 (Linux) 上不可用后,我想我可以尝试编写它我自己。

我找到了 libc 维护者 Ulrich Drepper 的一段话,他使用 mempcpy 发布了 strlcpy 的替代方案。我也没有 mempcpy,但它的行为很容易复制。首先,这是我的测试用例

#include <stdio.h>
#include <string.h>

#define BSIZE 10

void insp(const char* s, int n)
{
   int i;

   for (i = 0; i < n; i++)
      printf("%c  ", s[i]);

   printf("\n");

   for (i = 0; i < n; i++)
      printf("%02X ", s[i]);

   printf("\n");

   return;
}

int copy_string(char *dest, const char *src, int n)
{
   int r = strlen(memcpy(dest, src, n-1));
   dest[r] = 0;

   return r;
}

int main()
{
   char b[BSIZE];
   memset(b, 0, BSIZE);

   printf("Buffer size is %d", BSIZE);

   insp(b, BSIZE);

   printf("\nFirst copy:\n");
   copy_string(b, "First", BSIZE);
   insp(b, BSIZE);
   printf("b = '%s'\n", b);

   printf("\nSecond copy:\n");
   copy_string(b, "Second", BSIZE);
   insp(b, BSIZE);

   printf("b = '%s'\n", b);

   return 0;
}

这是它的结果:

Buffer size is 10                    
00 00 00 00 00 00 00 00 00 00 

First copy:
F  i  r  s  t     b     =    
46 69 72 73 74 00 62 20 3D 00 
b = 'First'

Second copy:
S  e  c  o  n  d          
53 65 63 6F 6E 64 00 00 01 00 
b = 'Second'

您可以在内部表示(创建的 insp() 行)中看到混入了一些噪声,例如检查后的 printf() 格式字符串第一个副本,第二个副本中的外部 0x01。

字符串被原封不动地复制并且它正确地处理了太长的源字符串(让我们暂时忽略将 0 作为长度传递给 copy_string 的可能问题,我稍后会解决这个问题)。

但为什么我的目标中有外部数组内容(来自格式字符串)?就好像目的地实际上已调整大小以匹配新长度。

最佳答案

字符串的末尾用\0 标记,之后的内存可以是任何内容,除非您的操作系统故意将其空白,否则它只是留在那里的任何随机垃圾。

请注意,在这种情况下,“问题”不在 copy_string 中,您正好复制​​了 10 个字符 - 但主代码中“first”之后的内存只是随机的。

关于C 奇怪的数组行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2836797/

相关文章:

c - C 中数组大小的最大值

C:如何在结构中存储二维字符数组?

gcc - 在不插入对 memcpy 的调用的情况下让 GCC 进行编译

python - 检测反射 DLL 注入(inject)

c - 二分查找 Int 数组大小问题

c++ - 在 VS2012 上将数据成员数组元素初始化为零?

php - 脚本将相同的值插入数据库

javascript - ES6 - 从现有数据创建新对象,仅使用一个属性,并删除任何重复项?

copy_to_user 与 memcpy

c - 如何处理 C 中的字节顺序