可能重复:
Segmentation Fault - C
#include<stdio.h>
#include<string.h>
int main()
{
char *p;
printf("enter some thing:");
gets(p);
printf("you have typed:%s\n",p);
}
为什么这个程序不起作用? 我不能将指针用作字符串。
输出是:
enter some thing:raihan
Segmentation fault (core dumped)
每次使用char指针时都会出现此错误。 我怎么解决这个问题? 我在Linux mint13 KDE上使用代码块。
答案 0 :(得分:3)
您尚未分配内存。您刚刚声明了一个指针p
,但没有指出任何指针。这解释了分段错误。您需要为缓冲区分配内存。
更重要的是,gets
不允许您指定缓冲区的大小。因此,您有可能在缓冲区的末尾运行。所以请改用fgets
。
int main(void)
{
char buffer[1024];//allocates a buffer to receive the input
printf("enter some thing: ");
fgets(buffer, sizeof(buffer), stdin);
printf("you have typed: %s\n", buffer);
return 0;
}
我还更正了main
的声明,并确保它返回一个值。
答案 1 :(得分:2)
您尚未为p
分配任何内存。此外,使用fgets
代替gets
,这可能会溢出输入缓冲区。
答案 2 :(得分:2)
char *p;
printf("enter some thing:");
gets(p);
错误。 Gets()尝试填充由提供的指针指向的数组 - 并且它是segfaults,因为该指针尚未初始化,因此它可能(并且确实)指向一些垃圾/无效的内存位置。使用
char p[256];
或类似的东西 - 如果用户输入长度超过255个字符的字符串,您仍然需要担心缓冲区溢出。您可以使用
解决该问题fgets(p, sizeof(p), stdin);
答案 3 :(得分:2)
您的指针已声明,但您尚未对其进行初始化,因此其值将是您可能无权写入的任意内存位置。因此,无论何时读取或写入此文件,您都会面临段错误的风险。使用对malloc
的调用为指针分配一些堆内存,然后在写入时不会出现段错误。
答案 4 :(得分:1)
你刚刚定义了一个指针 - 没有分配字符的内存!
使用数组或malloc。
答案 5 :(得分:1)
指针只是一个内存地址。它说“你这里有一些数据”。但它实际上并没有保留这些数据。
在你的情况下问题是双重的。指针没有指向有效的内存,你甚至没有把它设置为任何东西(所以它指向某个随机的地方)。
您可以通过不同方式解决此问题。最简单的方法就是使用一个数组(它有点隐式指针):
char something[100];
printf("enter some thing:");
gets(something);
在堆栈上给你100个字符。如果你愿意,你也可以指向它,但在这种情况下它有点多余:
char *p = something;
另一种方式是动态分配,您要求操作系统在运行时为您提供一些字节数。这样你就可以在完成使用后将它还给它。
char *something = (char*)malloc( 100 * sizeof(char) ); // Ask for 100 chars
printf("enter some thing:");
gets(something);
free(something); // Do this when you don't need that memory anymore.
PS:请记住,当你有字符串时,你总是需要一个额外的字节,而不是你想要存储的字符数。该字节用于字符串终止符,其值为0.