对于 const char* 的 scanf 的分段错误

Bla*_*est 1 c string pointers constants

我已经声明了一个变量

const char* mode;
Run Code Online (Sandbox Code Playgroud)

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

scanf("%s",mode)
Run Code Online (Sandbox Code Playgroud)

我收到分段错误。有什么建议?

Kei*_*son 5

应该scanf通话中得到警告。

通过声明

const char* mode;
Run Code Online (Sandbox Code Playgroud)

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

然后你打电话:

scanf("%s",mode);
Run Code Online (Sandbox Code Playgroud)

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

gcc 对此发出警告:

warning: writing into constant object (argument 2) [-Wformat]
Run Code Online (Sandbox Code Playgroud)

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

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

(如果这是一个初学者的练习,你也许可以忽略缓冲区溢出问题,现在,只是做mode点缓冲区这是合理的大,而且避免提供很长的输入。)