我已将变量声明为
const char* mode;
我想mode
从用户那里获得价值。当我使用
scanf("%s",mode)
我得到一个分段错误。有什么建议么?
您应该在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)
读取一个以空格分隔的字符串。您无法避免会溢出缓冲区的输入。stdin
mode
(如果这是一个初学者的练习,你现在可以忽略缓冲区溢出问题;只需mode
指出一个相当大的缓冲区,并避免提供很长的输入。)
您需要为指针分配内存以便能够用它做一些有意义的事情。将其声明为:
#define MAX_LENGTH 256
char *mode = malloc(MAX_LENGTH);
此外,如果需要的内存不是太大,最好进行堆栈分配:简单地说,
char mode[MAX_LENGTH];
分段错误通常是试图访问 CPU 无法物理寻址的内存。
那是因为你没有为你的变量分配内存。
注意:
但是一些像 Turbo C++ 这样的 c 编译器允许你这样做,甚至不需要分配内存。