动态分配数组的C问题
我的程序的输入文件的第一行包含一个int(称为N),它表示后面将有多少个整数(新行上的每个整数)。然后它应该将整数读入num_数组并打印出来。我认为我的问题是num_数组没有被正确分配。无论N是什么,代码中的调试语句都会打印出8作为sizeof(num_数组)动态分配数组的C问题,c,arrays,malloc,C,Arrays,Malloc,我的程序的输入文件的第一行包含一个int(称为N),它表示后面将有多少个整数(新行上的每个整数)。然后它应该将整数读入num_数组并打印出来。我认为我的问题是num_数组没有被正确分配。无论N是什么,代码中的调试语句都会打印出8作为sizeof(num_数组) #include <stdio.h> #include <pthread.h> #include <stdlib.h> int *num_array; int main (int argc, cha
#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;
}
将打印:
8
10
9
3.
212
56
99
4.
5.
如您所见,数组的最后一个元素被截断(不打印6),并且num_数组的大小似乎不正确(应包含N个整数,其中N是输入文件第一行的int)您的程序存在许多问题:
main()
函数的第一行有一个非常严重的错误
int numThreads = (int) argv[1]
在c中,casting不会转换类型,这种转换当然是可能的,但不会给出您期望的结果,您需要这样的东西
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;
}
将其更改为int-numThreads=atoi(argv[1]),仍然得到相同的结果result@jeremy我的回答并不是说它会解决您的问题,我仍在试图找到问题,但您应该发布文件中的示例数据,并且不要使用
atoi()
它不是很有用,因为您无法执行任何错误检查。@jeremy nevermind我刚刚找到了示例输入文件。
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
int *num_array;
int main (int argc, char**argv)
{
char line[20];
/*int numThreads = 1;*/
char *inputFile = "data.dat";
int N = 0;
int fileCounter = 0;
int i = 0;
FILE *file = fopen(inputFile, "r");
if (file == NULL)
return -1;
while (fgets(line, sizeof(line), file) != NULL)
{
if (fileCounter == 0)
{
N = atoi(line);
num_array = malloc((1 + N) * sizeof(int));
if (num_array == NULL)
{
fclose(file);
return -1;
}
}
else
{
num_array[fileCounter - 1] = atoi(line);
}
fileCounter++;
}
fclose(file);
printf("%ld", sizeof(num_array));
printf("\n");
printf("\n");
for (i = 0 ; i < N ; i++)
{
printf("%d\n", num_array[i]);
}
free(num_array);
return 0;
}