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

为什么我在函数中看到的是4字节字符串而不是2字节?在C中,c,pointers,char,C,Pointers,Char,我有一个函数 static void writeBytes(char ** pDestStr, char* item) { int size=strlen(item); // expected size==2 memcpy(*pDestStr,item,size); *pDestStr+=size; } 以及在struct头中定义的2字节字符串 typedef struct HEADER { unsigned char magicNo[2]; // two bytes } BM

我有一个函数

static void writeBytes(char ** pDestStr, char* item) {
  int size=strlen(item); // expected size==2
  memcpy(*pDestStr,item,size);
  *pDestStr+=size;
}
以及在struct
头中定义的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(char*)
,而不是它指向的字节数。

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

C中的字符串文字以空字符结尾,即
\0

因此,
“BM”
实际上是存储在连续位置的
B
M
0

strlen()

由于您的
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中查找。必须在代码中明确记住它。

C中的字符串文字以空字符结尾,即
\0

因此,
“BM”
实际上是存储在连续位置的
B
M
0

strlen()

由于您的
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语言中就不能这样做。您必须在代码中明确地记住它。

您能显示“内部”是什么吗?您可能会将指针的大小与数据类型的大小弄错。@user3121023可能是重复的:如果您将其作为答案发布,我将接受它。谢谢。您是在定义这些标题还是在尝试读取现有文件?官方的BMP头文件的前两个字节是
char[2]
:因此定义
char[3]
对您没有帮助。您能显示“里面”是什么吗?您可能会将指针的大小与数据类型的大小弄错。@user3121023可能是重复的:如果您将其作为答案发布,我将接受它。谢谢。您是在定义这些标题还是在尝试读取现有文件?官方BMP头文件的前两个字节是
char[2]
,因此定义
char[3]
对您没有帮助。
unsigned char magicNo[2]
只能存储
'B'
'M'
,没有空间容纳
'\0'
尽管OP接受这一点,
magicNo
没有必要成为字符串。它很可能是一个传递长度的2字节数组,特别是看
writeBytes()
定义,它只是一个memcpy。@BlueMoon这就是我的答案,要获得数组的大小,不能使用
strlen()
。我们在这里谈论的是同一件事。
无符号字符magicNo[2]
只能存储
'B'
'M'
,没有空间存放
'\0'
magicNo
没有必要成为字符串,尽管OP接受了这一点。它很可能是一个传递长度的2字节数组,特别是看
writeBytes()
定义,它只是一个memcpy。@BlueMoon这就是我的答案,要获得数组的大小,不能使用
strlen()
。我们在这里谈论的是同一件事。他没有在代码中的任何地方做
sizeof
,这在这里是无关的。@Vagish看看OP的帖子:
在writeBytes中有sizeof item==4字节和sizeof*item==1字节,因此我问,为什么会发生这种情况?
@Vagish在听写相关或不相关的内容之前,请仔细阅读问题。@BlueMoon抱歉,OP没有将sizeof格式化为代码格式,所以我理解了它的字面意思。他没有在代码中的任何地方执行
sizeof
,这在这里是不相关的。@Vagish看OP的帖子:
在writeBytes中有sizeof item==4字节和sizeof*item==1字节,因此我问,为什么会发生这种情况?
@Vagish在听写相关或不相关的内容之前,请仔细阅读问题。@BlueMoon抱歉,OP没有将sizeof格式化为代码格式,所以我理解了它的字面意思。