1

可能重复:
分段错误 - 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 上使用代码块。

4

6 回答 6

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并确保它返回一个值。

于 2012-09-15T10:05:28.637 回答
2

您还没有为p. 此外,使用fgets而不是gets可能会溢出输入缓冲区。

于 2012-09-15T10:02:19.623 回答
2
char *p;
printf("enter some thing:");
gets(p);

错误的。Gets() 尝试填充提供的指针指向的数组 - 它会出现段错误,因为该指针尚未初始化,因此它可能(并且确实)指向某个垃圾/无效内存位置。采用

char p[256];

或者类似的东西 - 如果用户输入的字符串长度超过 255 个字符,您仍然需要担心缓冲区溢出。您可以使用

fgets(p, sizeof(p), stdin);
于 2012-09-15T10:04:20.960 回答
2

您的指针已声明,但您尚未对其进行初始化,因此它的值将是您可能无权写入的任意内存位置。因此,无论何时您读取或写入此内容,您都会面临段错误的风险。使用调用为指针分配一些堆内存,malloc然后在写入时不会出现段错误。

于 2012-09-15T10:05:47.420 回答
1

您刚刚定义了一个指针 - 没有为字符分配内存!

使用数组或 malloc。

于 2012-09-15T10:01:45.640 回答
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。

于 2012-09-15T10:05:19.730 回答