2012-05-17 37 views

回答

2

您需要为指针分配内存才能对其执行一些有意义的操作。声明为:

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

而且,最好是有堆栈分配,如果需要,该内存是不是太大: 简单,

char mode[MAX_LENGTH]; 
+0

嗨ALS,但我需要使用const char *,因为我将这个变量传递给一个函数。我不能只用char *在这里。 – Blackforest

+2

你应该可以将'char *'传递给任何需要'const char *'的东西,反之则不然。 –

+0

谢谢Als。这样可行! – Blackforest

2

分割故障一般是访问内存的尝试CPU无法物理地址。

这是因为你没有为你的变量分配内存。
注意:
但是像Turbo C++这样的一些c编译器允许你在没有分配内存的情况下这样做。

+0

即使Turbo C代码在未初始化的指针中也会遇到麻烦,尽管在x86 *实模式中*不会导致段错误:某些随机内存已损坏。 – wallyk

4

应该已拨打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指向一个缓冲区这是合理的大,而且避免提供很长的输入)

+0

+1:为了抽出时间回答并详细解释,而不是像我一样给出答案。 –