初始化指向整数的指针的数组

时间:2018-06-26 02:40:00

标签: c arrays pointers

我正在尝试初始化并打印指向整数的指针数组。 这种初始化方法是否正确,或者当我们将其声明为指针数组时,可以使用其他任何方法进行初始化。无论如何,我们也可以使用数组ar1 [] []的传统数组。

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

#define NUM_COLS 4
#define NUM_ROWS 3

int main(void)
{
    int rowCnt;
    int colCnt;

    int *ar2[NUM_ROWS]={
                    (int[]){11,12,13,14},
                    (int[]){21,22,23,24},
                    (int[]){31,32,33,34},
                    };

    for(rowCnt=0;rowCnt<NUM_ROWS;rowCnt++)
    {
        for(colCnt=0;colCnt<NUM_COLS;colCnt++)
        {
            printf("%d\t",*(*(ar2+rowCnt)+colCnt));
        }
        printf("\n");
    }
    return(0);
}

3 个答案:

答案 0 :(得分:1)

由于您知道行数和列数,因此可以定义2D数组(通常是数组的数组)而不是指针数组:

int ar2[NUM_ROWS][NUM_COLS]={
    {11,12,13,14},
    {21,22,23,24},
    {31,32,33,34},
};

答案 1 :(得分:1)

下面的声明不正确。

int *ar2[NUM_COLS]={
                (int[]){11,12,13,14},
                (int[]){21,22,23,24},
                (int[]){31,32,33,34},
                };

这是INT_的NUM_COLS指针数组。这些指向int的指针的内存无法通过这种方式正确分配,并且将导致未定义的行为

如果要在堆栈上分配整个数组,可以执行以下操作:

int ar2[NUM_ROWS][NUM_COLS]= {
    {11,12,13,14},
    {21,22,23,24},
    {31,32,33,34},
    {0,0,0,0}
};

如果希望int的指针正确放置在堆上,则应分别使用malloc / free

int *ar2[NUM_ROWS];

for (int i = 0; i < NUM_ROWS; ++i)
{
   ar2[i] = (int*)malloc(sizeof(int) * NUM_COLS);
}

///now you can set up your arrays
memcpy(ar2[0], (int []){11,12,13,14}, 4 * sizeof(int));
memcpy(ar2[1], (int []){21,22,23,24}, 4 * sizeof(int));
memcpy(ar2[2], (int []){31,32,33,34}, 4 * sizeof(int));

///Do what you want with the array
...

///Free array once you are done
for (int i = 0; i < NUM_ROWS; ++i)
{
    free(ar2[i]);
}

答案 2 :(得分:1)

此初始化是正确的;复合文字具有与声明它们所在的块相匹配的生存期。在这种情况下,这些文字与ar2具有相同的生存期。

但是,除非您有其他要求(例如,想要不同长度的行),否则我建议像dbush的回答中那样使用简单的数组。