[英]C issue with dynamically allocating array
我程序的输入文件的第一行包含一个int(称为N),该int表示将有多少个后续整数(每个新行中的整数)。 然后它将整数读入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)
您的程序存在许多问题:
您的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
运算符不给出数组的长度,它给出该数组占用的字节数,并且您的变量不是数组,而是指针,因此在这种情况下, sizeof
运算符给出的是指针的大小。
事实证明,文件包含9
值,并在平台的指针大小是8
,所以sizeof(num_array)
是8
,其是9 - 1
因此你丢失一个值,则已经有该阵列的元件的数量N
,所以用吧
您永远不会调用free()
。
这是您代码的一个版本,已经修复,并且更加安全
#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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.