为什么我在函数中看到 4 字节字符串而不是 2 字节?在 C 中

Why I see 4 byte string instead 2 bytes in function? In C

我有一个功能

static void writeBytes(char ** pDestStr, char* item) {
  int size=strlen(item); // expected size==2
  memcpy(*pDestStr,item,size);
  *pDestStr+=size;
}

和结构HEADER

中定义的2字节字符串
typedef struct HEADER {
  unsigned char magicNo[2]; // two bytes
} BMPHEADER;

在我的程序中,magicNo 设置为 2 个字节,它包含 "BM"。但是当我这样调用函数时:

writeBytes(&pBlock, bmpfile->header.magicNo);

writeBytes里面有sizeof item == 4字节和sizeof *item == 1字节, 因此我问,为什么会这样?该字符串包含 2 个我未设置的附加字符。这是函数定义的第一行。结果该函数运行错误,因为它添加了指针 +4 而不是 +2 字节...知道如何解决这个问题吗?

已解决: 在评论中回答。 magicNo 的正确大小应该是 3,我缺少终止字符 \0。所以更正:

unsigned char magicNo[3];

在函数内部,当您执行 sizeof item 时,它 returns char 指针的大小,即 sizeof(char*),而不是它指向的字节数。

C 中的字符串文字以空字符结尾,即 [=12=]

因此"BM"实际上是BM0存储在连续的位置。

strlen() 计算传递的 char * 直到找到 '[=19=]' 字符。

因为您的 magicNo[2] 数组只有两个字节,所以它不包含空字符,strlen() 正在搜索您的情况下的空值,幸运的是在数组开头的第 5 个位置找到了空值这就是为什么你得到错误的字符串长度。

备注:

sizeof(magicNo); --> Gives size of `magicNo` array.
sizeof(item); --> Gives size of character pointer 
sizeof(*item); --> Gives size of single character

编辑: 在您的示例代码中:

int size=strlen(item); // expected size==2

你在这里假设是错误的,strlen不给出数组的大小。 如果你想根据传递给它的指针找到数组的大小,那么你不能在 C 中这样做。你必须在代码中明确地记住它。