为什么我在函数中看到 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"
实际上是B
、M
、0
存储在连续的位置。
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 中这样做。你必须在代码中明确地记住它。
我有一个功能
static void writeBytes(char ** pDestStr, char* item) {
int size=strlen(item); // expected size==2
memcpy(*pDestStr,item,size);
*pDestStr+=size;
}
和结构HEADER
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"
实际上是B
、M
、0
存储在连续的位置。
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 中这样做。你必须在代码中明确地记住它。