分段故障?为什么?

时间:2014-08-24 11:57:18

标签: c linux segmentation-fault

我不知道为什么此代码显示分段错误 .Below是代码

int main()
{   
    char *str;
    printf("\nEnter a string - \n");
    scanf("%s",str);
    printf("%s\n",str);
}

细分错误的原因是什么? 另外我想知道为什么在Linux中使用gets()函数是危险的?

1 个答案:

答案 0 :(得分:3)

首先,您可能需要知道可以使用char str[40] = {0};(编译时内存分配)。

由于您询问了有关动态内存分配的问题,因此在尝试存储任何内容之前,应该将内存分配给指针。因为指针可能指向任何随机位置(野指针),因此您可能尝试访问不适合访问的内存,这会导致段错误。

int main()
{   
    char *str;
    str = malloc(sizeof(char) * 40); // allocate memory where str will be pointing,here i allocate 40 bytes
    printf("\nEnter a string - \n");
    scanf("%39s",str);
    printf("%s\n",str);
    free(str); //important to release the memory!
}

要回答第二个问题,gets()在任何平台上都是危险的,因为它可能导致缓冲区溢出。

考虑一种情况,您尝试填充超出其容量的缓冲区:

char *buff = malloc(sizeof(char)*10);
strcpy(buff, "This String Will Definitely Overflow the Buffer Because It Is Tooo Large");

正如您所看到的,strcpy()函数将在'buff'中写入完整的字符串,但是'buff'的大小小于字符串的大小,因此数据将被写入数组的右边界“迷”。现在,根据您使用的编译器,很可能在编译期间不会注意到它并且在执行期间不会崩溃。原因很简单,因为内存属于程序,因此这个内存中的任何缓冲区溢出都可能被忽视。

因此,在这种情况下,缓冲区溢出会悄悄破坏相邻内存,如果程序使用了损坏的内存,则可能会导致意外结果。

安全的解决方法:

char *buf=NULL; 
size_t siz= 30; 
ssize_t len = getline(&buf,&siz,stdin);

这是一个解决方法?那么,你应该阅读更多getline()