【问题标题】:scanf seg fault in C with char* array带有char *数组的C中的scanf seg错误
【发布时间】:2015-06-27 14:44:19
【问题描述】:

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

这里的小程序应该生成一个简单的shell,读入一个命令并fork一个进程来执行它。问题在于本书的代码本身,在“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 中的内存管理是一段漫长的旅程。

【问题讨论】:

    标签: c segmentation-fault scanf


    【解决方案1】:
    char* args[MAX_LINE/2 + 1];
    

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

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

    并将文本读入其中:

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

    【讨论】:

      【解决方案2】:

      您正在传递一个指向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() 的工作原理,并且当您这样做时,您将开始编写更强大的程序,并且可能停止使用 @987654327 @也是。

      【讨论】:

      • 编译器应该显示警告。规则 #1:不要忽略 C 编译器警告:-)
      • @sfk 事实上,启用编译器警告,让它尽可能的烦人,这条规则适用于初学者以及有经验的 c 程序员。
      • 感谢您的回复。我修改了我的代码以尝试使用(分配的)char 指针并将其传递给 scanf,但是在输入 args 后仍然出现分段错误。代码中的其他内存问题是否可能导致早期段错误?即使我尝试在 scanf 之后立即打印 *args 的值,它也会失败。我知道我已经为字符串分配了足够的空间。
      • 当你做非法的事情时,大多数时候行为是未定义的,所以几乎任何事情都可能是原因,我会推荐一个调试器。
      猜你喜欢
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多