我正在阅读一本关于操作系统的书,我的一些示例代码给了我一个运行时分段错误。我对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语言学习记忆管理是一个很好的旅程。
答案 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]);