我只是尝试使用3个命令行参数运行此程序:2个int和1个文件名。
我一直在运行我的程序:
a.out 1 2 devices.txt
devices.txt看起来像这样:
1
我的主要方法如下:
int main(int argc, char* argv[]){
int MaxIterations, T, numDevices;
FILE *devices;
printf("Num arguments: %d \n", argc);
if(argc < 3 || argc > 4){
printf("ERROR, need exactly 2 or 3 arguments!\n");
return 1;
} else if (argc == 3){
MaxIterations = argv[1]; // max iterations allowed
T = argv[2]; // time interval
devices = fopen("devices.in", "r");
} else {
MaxIterations = argv[1];
T = argv[1];
devices = fopen(argv[3], "r");
if(devices == NULL){
fprintf(stderr, "CANT OPEN FILE: %s!\n", argv[3]);
exit(1);
}
}
FILE* file = fopen ("devices.txt", "r");
int i = 0;
fscanf(devices, "%d", numDevices);
printf("Number of devices: %d \n", numDevices);
fclose(devices);
return 0;
}
我错误的是给了我一个段错误? 我添加了debug printf来确定seg故障实际触发的位置,它看起来像是:
fscanf(devices, "%d", numDevices);
答案 0 :(得分:6)
启用编译器警告:
这是无效的:
fscanf(devices, "%d", numDevices);
这是你想要的:
fscanf(devices, "%d", &numDevices);
d
转换说明符需要指向有符号整数的指针。您传递了(未初始化的)对象numDevices
的值。
答案 1 :(得分:0)
问题是fscanf函数需要一个指向变量的指针,用于存储从文件读取的值。你需要像
这样的东西fscanf(devices, "%d", &numDevices);
你得到段错误的原因是在原始代码中,numDevices的(未初始化的)值被用作要写入的地址 - 并且由于它不太可能是有效的可写地址,因此段错误是通常的方式让你的电脑说“不!” :)