-5
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *p;
p=malloc(1);
scanf("%s",p);
printf("%s",p);
free(p);
}
该代码只需要27个字符之后出现分段错误。可以有人解释malloc(1)的这种奇怪行为吗?无法理解Malloc输出
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *p;
p=malloc(1);
scanf("%s",p);
printf("%s",p);
free(p);
}
该代码只需要27个字符之后出现分段错误。可以有人解释malloc(1)的这种奇怪行为吗?无法理解Malloc输出
你只分配一个字节。在你的例子中的第一个字节之后的任何一点,segfault都是公平的游戏。它恰好是你27字节。它每次运行程序的时间可能会有所不同
编辑: 如果你的意思是只分配了一个告别读取单个字符,改变你的功能:
scanf(" %c", p);
printf("%c", p);
领先的空间在前面在scanf上的字符说明符是欺骗scanf忽略它可能试图分配给你的缓冲区的任何空格(如果有的话)
我根本不觉得奇怪。你期望发生什么?你认为'malloc(1)'做了什么? – 2014-10-31 17:30:13
@ 1336087:即使只有一个字符是[未定义行为](http://en.wikipedia.org/wiki/Undefined_behavior)。必须有'scanf'来添加空终止符。 – 2014-10-31 17:42:24
@FredLarson:是的,OP应该分配至少2个字节。并使用'scanf(“%1s”,p);'或'fgets()'。 – user1336087 2014-10-31 17:44:46