#include<stdio.h>
int main()
{
char *str;
gets(str);
puts(str);
return 0;
}
输出=分段错误
为什么会出现分段错误?
答案 0 :(得分:7)
“指针如何分配内存”这一问题的答案非常简单:它们没有。这就是您遇到分段错误的原因:从未初始化的指针访问数据是未定义的行为。
程序员必须分配内存,并将其分配给指针。例如,您可以使用malloc
:
char *str = malloc(10);
fgets(str, 10, stdin);
puts(str);
关于上述修复的一个重要注意事项是使用fgets
而不是弃用的gets
。这是因为fgets
允许您告诉函数它可以在缓冲区中使用多少内存,而gets
则假定它具有所需的所有内存,从而导致缓冲区溢出。
答案 1 :(得分:2)
如果是
gets(str);
str
未初始化使用。作为自动局部变量,除非明确初始化,否则str
的内容是不确定的。它可能指向未分配给您的程序的内存位置。
使用(尝试写入或甚至从读取)未启动的内存导致undefined behavior。分割错误是副作用之一。
那就是说,gets()
是 纯邪恶 ,因为可能存在缓冲区溢出问题。请改用fgets()
。
答案 2 :(得分:1)
你需要先分配你的str。 像这样:
$scope.$watchCollection(function(){
return $state.params;
}, function(){
$log.info("State params have been updated", $scope.stateParams);
});
这将允许写入str。
为了更好的内存分配,知道你需要多少内存,而不是任意“4096”,这是个好主意。
此外,当你不再需要它时,不要忘记使用free()。