gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:03:56 29 4
gpt4 key购买 nike

我有一个函数

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];

最佳答案

C 中的字符串文字以空字符终止,即 \0

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

strlen() 计算传递的 char * 直到它找到 '\0' 字符。

由于您的 magicNo[2] 数组只有两个字节,它不包含空字符,strlen() 在您的情况下正在搜索 null 幸运的是 null位于数组开头的第 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 - 为什么我在函数中看到 4 字节字符串而不是 2 字节?在 C 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28583172/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com