scanf for const char *的分段错误

时间:2012-05-17 05:48:00

标签: c string pointers const

我已将变量声明为

const char* mode;

我想从用户那里获得mode的价值。我用的时候

scanf("%s",mode)

我遇到了分段错误。有什么建议吗?

3 个答案:

答案 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 ++这样的编译器允许你这样做,甚至不用分配内存。