我对malloc和realloc函数有疑问,当我使用malloc函数为字符指针10字节分配内存时.但是当我为该字符指针赋值时,如果我尝试分配则需要超过10个字节.怎么可能.
例如:
main()
{
char *ptr;
ptr=malloc(10*sizeof(char));
gets("%s",ptr);
printf("The String is :%s",ptr);
}
Run Code Online (Sandbox Code Playgroud)
样本输出:
$./a.out
hello world this is for testing
Run Code Online (Sandbox Code Playgroud)
字符串是:hello world,用于测试
现在看输出字符数超过10个字节.怎么可能,我需要明确的解释.提前致谢.
这就是为什么使用gets是一件邪恶的事情.请fgets改用.
malloc与它无关.
不可否认,理由是有用的,是吗?首先,
gets()不允许你指定存储字符串的缓冲区的长度.这将允许人们在缓冲区的末尾继续输入数据,相信我,这将是坏消息.
首先,让我们看一下这个函数的原型:
#include <stdio.h>
char *gets(char *s);
Run Code Online (Sandbox Code Playgroud)
您可以看到唯一的参数是char指针.那么,如果我们创建一个这样的数组:
char buf[100];
Run Code Online (Sandbox Code Playgroud)
我们可以把它传递给gets():
gets(buf)
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.或者似乎......但实际上我们的问题已经开始了.gets()只接收到数组的名称(指针),它不知道数组有多大,并且不可能仅从指针确定这个数字.当用户输入文本时,gets()会将所有可用数据读入数组,如果用户是明智的并输入少于99个字节,这将没有问题.但是,如果它们输入超过99,gets() 则不会停止在数组末尾写入.相反,它继续写到结束并进入它不拥有的内存.
这个问题可能以多种方式表现出来:
没有可见的影响,所以永远
立即终止程序(崩溃)
终止程序生命周期的后期(可能是1秒后,也许是15天后)
终止另一个无关的计划
程序行为和/或计算不正确......列表继续.这是"缓冲区溢出"错误的问题,你无法分辨它们何时以及如何咬你.
| 归档时间: |
|
| 查看次数: |
878 次 |
| 最近记录: |