【发布时间】:2012-05-17 05:47:59
【问题描述】:
我已将变量声明为
const char* mode;
我想从用户那里获取mode 的值。当我使用
scanf("%s",mode)
我遇到了分段错误。有什么建议吗?
【问题讨论】:
标签: c string pointers constants
我已将变量声明为
const char* mode;
我想从用户那里获取mode 的值。当我使用
scanf("%s",mode)
我遇到了分段错误。有什么建议吗?
【问题讨论】:
标签: c string pointers constants
您应该在scanf 通话中收到警告。
通过声明
const char* mode;
您将mode 设为指向 const char 的指针,这意味着您无法修改mode 指向的数据。
然后你调用:
scanf("%s",mode);
试图修改mode指向的数据。
gcc 对此发出警告:
warning: writing into constant object (argument 2) [-Wformat]
所以mode 需要是一个指向 non-const 字符的指针。而且,正如其他人所提到的,它需要指向一些实际数据,以便scanf 可以修改该数据。这可能是导致您的分段错误的原因,但由于您没有向我们展示 mode 是如何初始化的,所以很难说。
mode 通常会指向数组的第一个字符。那么该阵列必须有多大?由于您使用 scanf 和 "%s" 格式,它可能不够大。 scanf("%s", mode) 从stdin 读取一个以空格分隔的字符串到mode 指向的缓冲区中。您无法避免会溢出缓冲区的输入。
(如果这是一个初学者的练习,你可以暂时忽略缓冲区溢出问题;只需让mode 指向一个相当大的缓冲区,并避免提供很长的输入。)
【讨论】:
您需要为指针分配内存以便能够用它做一些有意义的事情。声明为:
#define MAX_LENGTH 256
char *mode = malloc(MAX_LENGTH);
另外,如果需要的内存不是太大,最好有堆栈分配: 简单来说,
char mode[MAX_LENGTH];
【讨论】:
char* 传递给任何需要const char* 的对象,但反之则不行。
分段错误通常是试图访问 CPU 无法物理寻址的内存。
那是因为你没有为你的变量分配内存。
注意:
但某些 c 编译器(如 Turbo C++)允许您在不分配内存的情况下这样做。
【讨论】: