gpt4 book ai didi

c++ - 谁能解释为什么输出大于分配的内存?

转载 作者:行者123 更新时间:2023-11-30 17:28:04 24 4
gpt4 key购买 nike

#include <stdio.h>

int main(void) {
char arr[10];
gets(arr);//let's suppose input is "abcdefgshsdfhdsfsh"
printf("%s",arr);//output come is same as input but the allocated arr have 10 bytes memory
//and can store only ten characters but how come it's possible i am getting output
//more than 10 character
return 0;
}

输出背后的原因是什么?任何帮助将不胜感激。

最佳答案

因为 gets 在从 stdin 获取字节并将它们放在某处时不会进行任何类型的检查。一个简单的例子:

char array1[] = "12345";
char array2[] = "67890";

gets(array1);

现在,首先你可以输入你想要的字符数,gets不会关心它。其次,超过放置它们的数组(在本例中为array1)大小的字节将覆盖它们在内存中找到的任何内容,因为gets将写入它们。在前面的示例中,这意味着如果您输入“abcdefghijklmnopqrts”,可能会意外地覆盖 array2 或其他内容。

该函数不安全,因为它假定输入一致。切勿使用它!

更安全的方法是fgets()

所以,你想避免获取。如果缓冲区足够大,可以容纳换行符,fgets 将始终读取换行符(这可以让您知道缓冲区何时太小并且有更多行等待读取)。如果您想要像 fgets 这样的东西不会读取换行符(丢失缓冲区太小的指示),您可以使用 fscanf 进行扫描集转换例如:“%N[^\n]”,其中“N”被缓冲区大小 - 1 替换。

使用 fgets 读取后从缓冲区中删除尾随换行符的一种简单(如果奇怪)方法是:strtok(buffer, "\n");这不是 strtok 的预期用途,但我以这种方式使用它的频率比预期的方式(我通常避免这样做)更频繁。

来源:从我保存的问题复制。

关于c++ - 谁能解释为什么输出大于分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26155222/

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