C 缓冲区和混淆,初学者

标签 c string printf c-strings

<分区>

我今天一直在弄乱 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,我觉得这不合理。

最佳答案

  1. 构建栈帧时,一些辅助数据被压入栈中,它可能包含也可能不包含零,最终标志着溢出缓冲区的结束
  2. C 字符串以零标记结束。您的前两个缓冲区不以零结尾,但 CPU 是专用的并读取内存,直到它真正找到一个零。通常某处会有一个...
  3. 未初始化的缓冲区包含以前使用时留在内存中的所有数据
  4. 堆栈在内存中“向下”增长,因此第一个缓冲区在地址“50”结束,第二个在地址“40”,第三个在地址“0”。但是,当您打印从地址“40”开始的第二个缓冲区时,它会向上读取内存,即 10 个 B、10 个 A 和一些字节,直到找到零。

读数:null-terminated string , buffer overflow , stack things .

C 字符串在字符串末尾需要一个额外的\0 字符,因此您的 'letters' 和 'nletters' 可以存储 9 个字母的实际字符串,加上零终止符(内存中不存在默认,你必须自己把它放在那里)。 'nums' 是一个整数数组,它并不真正适合存储字符串,但 C/C++ 不会阻止你这样做。这就是为什么我在上面写了“40”作为第二个缓冲区的假设地址:“nums”很可能是一个 4x10 字节的缓冲区,带有 32 位整数。

关于C 缓冲区和混淆,初学者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51343059/

相关文章:

c - C 中用于排序 time_t 对象的动态数据结构?

c++ - 从(开放的)Solaris 交叉编译到 Windows?

c - 如何使用 system() 而不是 rename() 在 C 中重命名文件

c - 当我运行这个程序时结构崩溃

c - 在 C 中发送的推荐 block 大小?

ruby - ActiveRecord 值是字符串类型数字的列的平均值

java - StringBuilder JAVA 的性能问题

java - 在Java中如何用字符串替换任意字符?

matlab - 在 matlab 函数中控制冗长的想法/最佳实践

php - 如何将可变数量的参数传递给 sprintf() 函数?