我不知道为什么此代码显示分段错误 .Below是代码
int main()
{
char *str;
printf("\nEnter a string - \n");
scanf("%s",str);
printf("%s\n",str);
}
细分错误的原因是什么?
另外我想知道为什么在Linux中使用gets()
函数是危险的?
答案 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()
。