我已将变量声明为
const char* mode;
我想从用户那里获得mode
的价值。我用的时候
scanf("%s",mode)
我遇到了分段错误。有什么建议吗?
答案 0 :(得分:4)
你应在scanf
来电时收到警告。
宣布
const char* mode;
使mode
成为指向const char的指针,这意味着您无法修改mode
指向的数据。
然后你打电话:
scanf("%s",mode);
尝试修改mode
指向的数据。
gcc警告说:
warning: writing into constant object (argument 2) [-Wformat]
所以mode
需要是指向非const char的指针。而且,正如其他人所提到的,它需要指向一些实际数据,以便scanf
可以修改该数据。这可能是导致您的分段错误的原因,但由于您没有向我们展示mode
如何初始化,因此很难说清楚。
mode
通常指向数组的第一个字符。那么阵列有多大?由于您使用的scanf
格式为"%s"
,因此它可能不够大。 scanf("%s", mode)
将stdin
中以空格分隔的字符串读入mode
指向的缓冲区。你无法避免会溢出缓冲区的输入。
(如果这是一个初学者的练习,你可能暂时忽略缓冲区溢出问题 ;只是让mode
指向一个相当大的缓冲区,并避免提供很长的输入。)
答案 1 :(得分:2)
您需要为指针分配内存,以便能够对其执行有意义的操作。声明为:
#define MAX_LENGTH 256
char *mode = malloc(MAX_LENGTH);
另外,如果所需的内存不是太大,最好进行堆栈分配: 简单地说,
char mode[MAX_LENGTH];
答案 2 :(得分:2)
分段错误通常是尝试访问CPU无法物理寻址的内存。
那是因为你没有为变量分配内存。
注意:
但是有些像Turbo C ++这样的编译器允许你这样做,甚至不用分配内存。