Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单C程序中的总线错误_C_Bus Error - Fatal编程技术网

简单C程序中的总线错误

简单C程序中的总线错误,c,bus-error,C,Bus Error,我有以下简单的程序。我从命令行运行“programfile.txt”,得到“Bus error”,没有输出。我不知道我做错了什么 #include<stdio.h> int main(char *arg[]) { FILE *file = fopen(arg[0], "r"); if (file == NULL) { printf("Cannot open file.\n"); exit(1); } return

我有以下简单的程序。我从命令行运行“programfile.txt”,得到“Bus error”,没有输出。我不知道我做错了什么

#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;
}
#包括
int main(字符*参数[])
{
FILE*FILE=fopen(arg[0],“r”);
if(file==NULL){
printf(“无法打开文件。\n”);
出口(1);
}
返回1;
}

假设main的类型为

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

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

如果main的类型是

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

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

c entry函数的原型是

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;
}
#包括
int main(int argc,char*argv[])
{
FILE*FILE=fopen(argv[1],“r”);
if(file==NULL){
printf(“无法打开文件。\n”);
出口(1);
}
返回1;
}

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;
}
#包括
int main(int argc,char*argv[])
{
FILE*FILE=fopen(argv[1],“r”);
if(file==NULL){
printf(“无法打开文件。\n”);
出口(1);
}
返回1;
}

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

intmain(intargc,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
}
#包括
#包括
int main(int argc,char*argv[])
{
文件*文件;
如果(argc!=2)
{
fprintf(stderr,“用法:myprogram\n”);
出口(1);
}
file=fopen(argv[1],“r”);
if(file==NULL){
fprintf(stderr,“无法打开文件。\n”);
出口(2);
}
退出(0);//状态0表示无错误
}
变化:

  • 我添加了
    #include
    ,以获得
    exit()的声明

  • 我检查参数的数量,如果不正确,则打印Usage:string

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

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


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

intmain(intargc,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
}
#包括
#包括
int main(int argc,char*argv[])
{
文件*文件;
如果(argc!=2)
{
fprintf(stderr,“用法:myprogram\n”);
出口(1);
}
file=fopen(argv[1],“r”);
if(file==NULL){
fprintf(stderr,“无法打开文件。\n”);
出口(2);
}
退出(0);//状态0表示无错误
}
变化:

  • 我添加了
    #include
    ,以获得
    exit()的声明

  • 我检查参数的数量,如果不正确,则打印Usage:string

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

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


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

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

否,我在打印arg[0]时也遇到问题。因此,请将main类型更改为int main(int argc,char*argv[])好的,谢谢!工作得很好!更改为您的建议并使用了argv[1]后,效果良好。不,我在打印arg[0]时也遇到了问题。因此,请将主类型更改为int main(int argc,char*argv[])好的,谢谢!工作得很好!更改为您的建议并使用了argv[1]并且有效。在本例中,
arg
保留传递的参数数。在本例中,
arg
保留传递的参数数。