指针如何分配内存

时间:2015-08-24 20:58:06

标签: c pointers segmentation-fault gets

#include<stdio.h>
int main()
{

  char *str;

  gets(str);

  puts(str);

return 0;
}

输出=分段错误

为什么会出现分段错误?

3 个答案:

答案 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()。​​