1

我已将变量声明为

const char* mode;

我想mode从用户那里获得价值。当我使用

scanf("%s",mode)

我得到一个分段错误。有什么建议么?

4

3 回答 3

5

应该scanf通话中收到警告。

通过声明

const char* mode;

你创建mode了一个指向 const char 的指针,这意味着你不能修改mode指向的数据。

然后你打电话:

scanf("%s",mode);

它试图修改mode指向的数据。

gcc 对此发出警告:

warning: writing into constant object (argument 2) [-Wformat]

所以mode需要一个指向非常量字符的指针。而且,正如其他人所提到的,它需要指向一些实际数据,以便scanf可以修改该数据。这可能是导致您的分段错误的原因,但是由于您没有向我们展示如何mode初始化,所以很难说。

mode通常会指向数组的第一个字符。那么该阵列必须有多大?由于您使用scanf的是"%s"格式,因此它可能不够大。 从 .指向的缓冲区中scanf("%s", mode)读取一个以空格分隔的字符串。您无法避免会溢出缓冲区的输入。stdinmode

(如果这是一个初学者的练习,你现在可以忽略缓冲区溢出问题;只需mode指出一个相当大的缓冲区,并避免提供很长的输入。)

于 2012-05-17T06:11:01.310 回答
2

您需要为指针分配内存以便能够用它做一些有意义的事情。将其声明为:

#define MAX_LENGTH 256
char *mode = malloc(MAX_LENGTH);

此外,如果需要的内存不是太大,最好进行堆栈分配:简单地说,

char mode[MAX_LENGTH];
于 2012-05-17T05:51:02.000 回答
2

分段错误通常是试图访问 CPU 无法物理寻址的内存。

那是因为你没有为你的变量分配内存。
注意:
但是一些像 Turbo C++ 这样的 c 编译器允许你这样做,甚至不需要分配内存。

于 2012-05-17T05:54:33.770 回答