无法在 for 循环中打印出数组的元素

Can not print out the elements of an array in a for-loop

为什么我不能在 for 循环中打印出数组的元素? 我的环境是Windows 7最大值, gcc (MinGW.org GCC-6.3.0-1) 6.3.0 我从 3 1 2 3 这样的提示中输入数据。 我可以做到,例如,printf("%" PRId64 " ", marray[2]) 但是从 for 循环它不起作用。

这里是源代码:

#define __USE_MINGW_ANSI_STDIO 1
#define __STDC_FORMAT_MACROS 1

#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>

size_t read_size() {
    size_t x;
    scanf("%lu", &x);
    return x;
}

int64_t read_int64() {
    int64_t x;    
    scanf("%" SCNd64, &x);
    return x;
}

int main() {
    size_t *size;
    *size = read_size();
    int64_t *marray = malloc(sizeof(int64_t) * *size);
    for (size_t i = 0; i < *size; i++) {
        marray[i] = read_int64();
    }
        
    for (size_t i = 0; i < *size; i++) {
        printf("%" PRId64 " ", marray[i]);
    }
    free(marray);
    return 0;
}

首先,在 main() 你有:

size_t *size;  //creating an uninitialized pointer

那你打电话给

*size = read_size();  
^ (dereferencing an uninitialized pointer

这将导致未定义的行为。 (read about nasal demons here。基本上任何事情都可能在这里发生。在我的系统上,这是一个 run-time 错误。(...Local 'size' was referenced before being initialized.注意:如果你不看到类似的东西,打开你的编译器警告

所以,正如评论中指出的那样,无论如何,在这里使用指针并不是正确的方法...

*size = read_size();

建议更改以下内容:

size_t read_size(){
    size_t x;
    scanf("%lu", &x);
    return x;
}

收件人:

size_t read_size(void){//note, its portable to include `void` in `void` prototypes
    size_t x;
    scanf("%zu", &x); //zu, not lu for size_t format specifier
    return x;
}

然后这样称呼它:

//size_t* size;
size_t size = read_size();

然后也改变这些:

int64_t* marray = malloc(sizeof(int64_t)**size);
...
for (size_t i = 0; i < *size; i++){

至:

int64_t* marray = malloc(sizeof(int64_t) * size);
if(marray)
{//always verify successful call before attempting to use memory
...
for (size_t i = 0; i < size; i++){//removed the dereference on size  

编辑 - 注释表明需要动态创建二维数组:

评论表明您的意图是

int64_t* marray = malloc(sizeof(int64_t)**size);

创建一个二维数组。该语句只会创建一个单维数组,并且可能不是您想象的大小。

一般来说,创建一个指向数组的指针,然后创建指向每一列的指针...(例如,不知道两个维度,下面将创建两个size

int rows = size
int cols = size
int64_t **marray = malloc(sizeof(int64_t) * rows*cols);
if(!marray)//handle error
{
      for(int i = 0; i < cols ; i++)
      {
           marray[i] = malloc( rows * sizeof(int64_t));
           if(!marray[i]) //handle error;
      }
}

此方法近似于评论中指出的方法,但 IMO 这不是最佳方法。它为每次调用 malloc 创建 non-contiguous 个内存块,并且每次调用 malloc() 都需要调用一次 free()。一个更好的方法 。 (仅调用一次 malloc()/free() 来创建和释放二维数组。)