【发布时间】:2015-10-26 13:10:21
【问题描述】:
这是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char* p;
p = (char*)malloc(0);
scanf("%s", p);
printf("%s", p);
free(p);
}
有人可以向我解释为什么我通过终端输入的每个单词都会打印给用户吗?我有malloc(0)。当我尝试scanf 给我segmentation fault 时不应该吗?
编辑
为什么这会给我一个编译错误:
p = malloc(sizeof(char) * 2)
当我试图避免(void*)
error: cannot initialize a variable of type 'char *' with an rvalue of type 'void *'
【问题讨论】:
-
您正在处理未定义的行为。
-
@Korpel:它不起作用。你只是幸运。 en.wikipedia.org/wiki/Undefined_behavior
-
为什么你认为将任意长度的字符串扫描到大小为 1 字节的缓冲区中将比大小为 0 字节的缓冲区定义得更多?
-
如果最后一行(没有强制转换)触发编译错误,可能是因为您使用的是 C++ 编译器而不是 C 编译器。在 C 语言中,有一个明确定义的与
void*之间的隐式转换。