【问题标题】:Bus error in simple C program简单 C 程序中的总线错误
【发布时间】:2012-06-09 02:18:39
【问题描述】:

我有以下简单的程序。我正在从命令行运行“程序 file.txt”并得到“总线错误”而没有输出。我不知道我在这里做错了什么。

#include<stdio.h>

int main(char *arg[])
{

    FILE *file = fopen(arg[0], "r");

    if (file == NULL) {
        printf("Cannot open file.\n");
        exit(1);
    }

    return 1;
}

【问题讨论】:

    标签: c bus-error


    【解决方案1】:

    argv[0] 包含应用程序名称。尝试改用argv[1]

    【讨论】:

    • 在这种情况下,arg 保存传递的参数数量。
    【解决方案2】:

    c入口函数的原型是

    int main(int argc, char *arg[]);
    

    因此,对于您的原型,您实际上是在尝试取消引用 int 以传递给 fopen
    试试这个

    #include<stdio.h>
    int main(int argc, char *argv[])
    {
        FILE *file = fopen(argv[1], "r");
        if (file == NULL) {
            printf("Cannot open file.\n");
            exit(1);
        }
        return 1;
    }
    

    【讨论】:

      【解决方案3】:

      main() 的标准原型应如下所示:

      int main(int argc, char * argv[]);

      您只用一个参数argv 声明了您的main()。但是系统将参数计数作为第一个参数传递。

      当您指定单个参数(文件file.txt)时,argc 被设置为 1。但您的程序试图使用整数 1 作为char **。这会导致总线错误。

      这是您的程序的编辑版本:

      #include <stdio.h>
      #include <stdlib.h>
      
      int main(int argc, char *argv[])
      {
      
          FILE *file;
      
          if (argc != 2)
          {
              fprintf(stderr, "Usage: myprogram <filename>\n");
              exit(1);
          }
      
          file = fopen(argv[1], "r");
      
          if (file == NULL) {
              fprintf(stderr, "Cannot open file.\n");
              exit(2);
          }
      
          exit(0); // status 0 to signal no error
      }
      

      变化:

      • 我添加了#include &lt;stdlib.h&gt; 以获得exit() 的声明。

      • 我检查参数的数量并打印一个 Usage: 字符串,如果它不正确。

      • 我将错误消息打印到stderr,而不是标准输出。

      • 我将return 1改为exit(0),以明确表示程序正在成功退出。

      【讨论】:

        【解决方案4】:

        你能打印出arg[0]的值吗,假设main的类型是

        int main(int argc, char* argv[])
        

        argv[0] 是进程的名称,argv[1] 是第一个参数。

        【讨论】:

        • 不,我也无法打印出 arg[0]。
        • 所以,将主类型更改为 int main(int argc, char* argv[])
        • 好的,谢谢!工作完美!更改为您的建议并使用 argv[1] 并且有效。
        猜你喜欢
        • 2014-08-15
        • 2012-04-18
        • 2013-11-13
        • 2011-08-08
        • 2014-01-15
        • 2018-11-21
        • 2011-06-29
        • 1970-01-01
        • 2013-11-22
        相关资源
        最近更新 更多