我程序的输入文件的第一行包含一个int(称之为N),它将表示将有多少个整数(新行上的每个整数)。然后它应该将整数读入num_array并打印出来。我的问题是我认为num_array没有正确分配。无论N是什么,代码中的调试语句都将打印出8作为sizeof(num_array)。
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
int *num_array;
int main (int argc, char**argv){
int numThreads = (int) argv[1];
char *inputFile = argv[2];
int N = 0;
char line[20];
FILE *file = fopen(inputFile, "r");
int fileCounter = 0;
while(fgets(line, sizeof(line), file)) {
if (fileCounter==0){
N = atoi(line);
num_array = malloc(sizeof(int)*(N+1));
}
else{
num_array[fileCounter-1] = atoi(line);
}
fileCounter++;
}
fclose(file);
int i;
printf("%d", sizeof(num_array));
printf("\n");
printf("\n");
for(i = 0; i<sizeof(num_array); i++){
printf("%d\n", num_array[i]);
}
return 0;
}
输入文件示例:
9
10
9
3
212
56
99
4
5
6
将打印出来:
8
10
9
3
212
56
99
4
5
正如您所看到的,数组的最后一个元素被截断(不打印6)并且看起来num_array的大小不正确(应该包含N个整数,其中N是输入文件第一行的int) )
答案 0 :(得分:3)
您的计划存在许多问题:
main()
函数的第一行有一个非常严重的错误
int numThreads = (int) argv[1]
在c转换中没有转换类型,这种转换肯定是可能的,但是没有给出你期望的结果,你需要这样的东西
char *endptr;
int numThreads = strtol(argv[1], &endptr, 10);
if (*endptr != '\0')
{
printf("`%s' cannot be converted to an integer\n", argv[1]);
return -1;
}
您没有确保为您的程序命令行提供了参数,您需要检查一下,argc
包含传递给的程序行参数的数量你的程序+ argv[0]
,所以你必须检查
if (argc < 2)
{
printf("Use: %s NumberOfThreads, where NumberOfThreads is `int'\n", argv[0]);
return -1;
}
您不会检查fopen()
是否返回NULL
,这会导致fgets()
file
指针时出现更多问题。
sizeof
运算符没有给出数组的长度,它给出了数组占用的字节数,而你的变量不是数组,它是指针,所以{在这种情况下,{1}}运算符给出了指针的大小。
事实证明,您的文件包含sizeof
个值,并且在您的平台中,指针大小为9
,因此8
为sizeof(num_array)
,因为8
因此你缺少一个值,你已经拥有了数组9 - 1
的元素数量,所以请使用它。
您永远不会致电N
。
这是您的代码的一个版本,它已修复并且更安全
free()