C动态分配数组的问题

时间:2015-03-13 02:01:37

标签: c arrays malloc

我程序的输入文件的第一行包含一个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) )

1 个答案:

答案 0 :(得分:3)

您的计划存在许多问题:

  1. 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;
     }
    
  2. 您没有确保为您的程序命令行提供了参数,您需要检查一下,argc包含传递给的程序行参数的数量你的程序+ argv[0],所以你必须检查

    if (argc < 2)
     {
        printf("Use: %s NumberOfThreads, where NumberOfThreads is `int'\n", argv[0]);
        return -1;
     }
    
  3. 您不会检查fopen()是否返回NULL,这会导致fgets() file指针时出现更多问题。

  4. sizeof运算符没有给出数组的长度,它给出了数组占用的字节数,而你的变量不是数组,它是指针,所以{在这种情况下,{1}}运算符给出了指针的大小。

    事实证明,您的文件包含sizeof个值,并且在您的平台中,指针大小为9,因此8sizeof(num_array),因为8因此你缺少一个值,你已经拥有了数组9 - 1的元素数量,所以请使用它。

  5. 您永远不会致电N

  6. 这是您的代码的一个版本,它已修复并且更安全

    free()