使用char *数组的C中的scanf seg错误

时间:2015-04-20 18:09:15

标签: c segmentation-fault scanf

我正在阅读一本关于操作系统的书,我的一些示例代码给了我一个运行时分段错误。我对Java中的C有些新意,我希望有人能指出我正确的方向。

这里的小程序应该生成一个简单的shell,读取一个命令并分叉一个进程来执行它。问题在于本书的代码本身,在" scanf"功能调用;当我在" osh>"输入内容时提示,我得到了分段错误。

形成我对C的了解,我认为可能需要为args数组分配内存,但由于它是在main函数中直接声明的数组,我想我可能不需要。我想如果我这样做了,那就是书中的代码。

无论如何,这里是生成错误的代码:

char* args[MAX_LINE/2 + 1]; /* command line (of 80) has max of 40 arguments */

int should_run = 1; 

int i, upper;

while (should_run){   
    printf("osh>");
    fflush(stdout);


scanf("%s", args); /* THIS CAUSES SEGFAULT */

char* localArgs[3];
char* pch;

/ * ... * /

提前感谢您的帮助。用C语言学习记忆管理是一个很好的旅程。

2 个答案:

答案 0 :(得分:3)

您正在向scanf()传递指针数组,它需要一个char数组。

如何正确使用scanf()扫描文本字符串的示例

char string[100];

if (scanf("%99s", string) == 1)
 {
    printf("scanned string: %s\n", string);
 }
else
 {
    printf("error: unexepected error in `scanf()'.\n);
 }

仔细阅读链接以了解为什么我像我一样编写此代码,如果你这样做,你将开始理解scanf()如何工作,当你这样做时,你将开始编写更强大的程序,并可能会停止使用scanf()也是。

答案 1 :(得分:3)

char* args[MAX_LINE/2 + 1];

这是创建一个char指针大小(MAX_LINE / 2 + 1)的数组。如果要将其中一个char指针用作字符串,则必须分配它们:

args[which_arg] = malloc(arg_max_length*sizeof(char));

并将文字读入其中:

scanf("%s", args[which_arg]);