动态分配数组的 C 问题
C issue with dynamically allocating array
我的程序的输入文件的第一行包含一个整数(称之为 N),它表示将有多少个后续整数(每个整数占一行)。然后它应该将整数读入 num_array 并打印出来。我的问题是我认为 num_array 没有正确分配。代码中的调试语句将打印出 8 是 sizeof(num_array) 不管 N 是什么。
#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 是输入文件的第一行)
你的程序有很多问题:
你的main()
函数的第一行有一个非常严重的错误
int numThreads = (int) argv[1]
in c casting 不转换类型,这种转换当然是可能的,但没有给出你期望的结果,你需要这样的东西
char *endptr;
int numThreads = strtol(argv[1], &endptr, 10);
if (*endptr != '[=11=]')
{
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()
returns 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;
}
我的程序的输入文件的第一行包含一个整数(称之为 N),它表示将有多少个后续整数(每个整数占一行)。然后它应该将整数读入 num_array 并打印出来。我的问题是我认为 num_array 没有正确分配。代码中的调试语句将打印出 8 是 sizeof(num_array) 不管 N 是什么。
#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 是输入文件的第一行)
你的程序有很多问题:
你的
main()
函数的第一行有一个非常严重的错误int numThreads = (int) argv[1]
in c casting 不转换类型,这种转换当然是可能的,但没有给出你期望的结果,你需要这样的东西
char *endptr; int numThreads = strtol(argv[1], &endptr, 10); if (*endptr != '[=11=]') { 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()
returnsNULL
,当你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;
}