Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态分配数组的C问题_C_Arrays_Malloc - Fatal编程技术网

动态分配数组的C问题

动态分配数组的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

我的程序的输入文件的第一行包含一个int(称为N),它表示后面将有多少个整数(新行上的每个整数)。然后它应该将整数读入num_数组并打印出来。我认为我的问题是num_数组没有被正确分配。无论N是什么,代码中的调试语句都会打印出8作为sizeof(num_数组)

#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;
     }