gpt4 book ai didi

C 在缓冲区中创建额外的字节

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

我今天一直在弄乱 C,当我在这段代码中注释掉第三个缓冲区时不明白输出的区别:

 #include <unistd.h>
#include <string.h>
#include <stdio.h>
void main() {
unsigned char letters[10];
memset(letters, 0x00, 10);
memset(letters, 0x41, 10);
printf(letters);
printf(" Total buffer len: %d bytes\n",strlen(letters));

char nletters[10];
memset(nletters, 0x00, 10);
memset(nletters, 0x42, 10);
printf(nletters);
printf(" Total buffer len: %d bytes\n",strlen(nletters));

int nums[10];
memset(nums, 0x00, 10);
memset(nums, 0x43, 10);
printf(nums);
printf(" Total buffer len: %d bytes\n",strlen(nums));
return 0;
}

区别在于删除了 nums 缓冲区周围的注释:

AAAAAAAAAA�7ǝ�U Total buffer len: 16 bytes
BBBBBBBBBBAAAAAAAAAA�7ǝ�U Total buffer len: 26 bytes

还有缓冲区留在:

AAAAAAAAAA Total buffer len: 10 bytes
BBBBBBBBBBAAAAAAAAAA Total buffer len: 20 bytes
CCCCCCCCCC��U Total buffer len: 14 bytes

我没有得到的是:

  1. 注释掉第三个缓冲区如何影响其他缓冲区的大小?

  2. 缓冲区末尾的额外字节是什么?我如何丢失/管理它们(如果我选择连接缓冲区)?

  3. 为什么我选择是否注释第三个buffer时打印的buffer size和初始化的size不一致?

  4. 缓冲区 2 应该是 10 个字节,为什么是 20 个字节?我不要20,我只要求10,我觉得这不合理。

最佳答案

char C 中的字符串实际上称为null-terminated 字节字符串null-terminated 位很重要,所有字符串函数都会查找它以了解字符串何时结束。

如果将未终止的字符串传递给字符串函数,它将越界并导致 undefined behavior .

终止符为零,可以是整数0,也可以是字符'\0'

当然,这个空终止符在您的字符串中需要空间。这意味着 10 个字符的字符串必须有 11 个字符的空间以适合终止符。

最简单的第一个看起来像

char letters[11] = { 0 };  // Space for ten character plus terminator
// The above definition also initializes all elements in the array to zero,
// which is the terminator character

memset(letters, 'A', 10); // Set the ten first characters to the letter 'A'

printf("%s", letters); // Never print a data string directly using printf's first parameter.

printf(" Total buffer len: %d bytes\n", strlen(letters));

注意 printf 的变化。这是因为如果您从用户那里获得字符串输入,将其作为格式字符串直接传递给 printf 是一个非常糟糕的安全漏洞。如果字符串包含格式化代码但没有参数,则会导致未定义的行为

另请注意,我更改了 magic number 0x41ASCII对应的字符。魔数(Magic Number)是一种坏习惯,它会使代码更难阅读、理解和维护。

关于C 在缓冲区中创建额外的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51342829/

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