动态分配数组的 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 是输入文件的第一行)

你的程序有很多问题:

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

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

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

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

  5. 你从不打电话给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;
 }