2014-10-31 67 views
-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输出

+1

我根本不觉得奇怪。你期望发生什么?你认为'malloc(1)'做了什么? – 2014-10-31 17:30:13

+1

@ 1336087:即使只有一个字符是[未定义行为](http://en.wikipedia.org/wiki/Undefined_behavior)。必须有'scanf'来添加空终止符。 – 2014-10-31 17:42:24

+0

@FredLarson:是的,OP应该分配至少2个字节。并使用'scanf(“%1s”,p);'或'fgets()'。 – user1336087 2014-10-31 17:44:46

回答

4

你只分配一个字节。在你的例子中的第一个字节之后的任何一点,segfault都是公平的游戏。它恰好是你27字节。它每次运行程序的时间可能会有所不同

编辑: 如果你的意思是只分配了一个告别读取单个字符,改变你的功能:

scanf(" %c", p); 
printf("%c", p); 

领先的空间在前面在scanf上的字符说明符是欺骗scanf忽略它可能试图分配给你的缓冲区的任何空格(如果有的话)