分割的错,我已经声明一个变量作为与scanf函数用于为const char *
const char* mode;
我想要得到的mode
从用户的值。当我使用
scanf("%s",mode)
我得到一个分段错误。有什么建议么?
分割的错,我已经声明一个变量作为与scanf函数用于为const char *
const char* mode;
我想要得到的mode
从用户的值。当我使用
scanf("%s",mode)
我得到一个分段错误。有什么建议么?
您需要为指针分配内存才能对其执行一些有意义的操作。声明为:
#define MAX_LENGTH 256
char *mode = malloc(MAX_LENGTH);
而且,最好是有堆栈分配,如果需要,该内存是不是太大: 简单,
char mode[MAX_LENGTH];
分割故障一般是访问内存的尝试CPU无法物理地址。
这是因为你没有为你的变量分配内存。
注意:
但是像Turbo C++这样的一些c编译器允许你在没有分配内存的情况下这样做。
即使Turbo C代码在未初始化的指针中也会遇到麻烦,尽管在x86 *实模式中*不会导致段错误:某些随机内存已损坏。 – wallyk
您应该已拨打scanf
电话的警告。
通过声明
const char* mode;
你让mode
一个指针为const char,这意味着你无法将数据修改mode
点。
然后调用:
scanf("%s",mode);
其试图将数据修改mode
点。
GCC警告一下:
warning: writing into constant object (argument 2) [-Wformat]
所以mode
需要是指向非const字符。而且,正如其他人所提到的,它需要指向一些实际数据,以便scanf
可以修改该数据。这可能是你的分段错误,但由于你没有向我们展示mode
是如何初始化的,所以很难说清楚。
mode
通常会指向数组的第一个字符。那么这个数组有多大?由于您使用的scanf
格式为"%s"
,因此它不可能足够大。 scanf("%s", mode)
从stdin
读取一个空白分隔的字符串到mode
指向的缓冲区中。您无法避免会使缓冲区溢出的输入。
(如果这是一个初学者的练习,你也许可以忽略缓冲区溢出问题现在;只是让mode
指向一个缓冲区这是合理的大,而且避免提供很长的输入)
+1:为了抽出时间回答并详细解释,而不是像我一样给出答案。 –
嗨ALS,但我需要使用const char *,因为我将这个变量传递给一个函数。我不能只用char *在这里。 – Blackforest
你应该可以将'char *'传递给任何需要'const char *'的东西,反之则不然。 –
谢谢Als。这样可行! – Blackforest