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

C 初始化指向整数的指针数组,c,arrays,pointers,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]={

我试图初始化并打印指向整数的指针数组。 当我们将它声明为指针数组时,这个初始化方法是正确的还是任何其他方法都可以初始化。我们也可以使用传统的数组数组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);
}
#包括
#包括
#定义NUM_COLS 4
#定义第3行的数量
内部主(空)
{
int rowCnt;
int-colCnt;
int*ar2[行数]={
(int[]){11,12,13,14},
(int[]){21,22,23,24},
(int[]){31,32,33,34},
};

对于(rowCnt=0;rowCnt,由于您知道行数和列数,因此可以定义2D数组(正式为数组数组数组)而不是指针数组:

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

由于您知道行数和列数,因此可以定义二维数组(正式称为数组数组)而不是指针数组:

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

下面的声明不正确

int *ar2[NUM_COLS]={
                (int[]){11,12,13,14},
                (int[]){21,22,23,24},
                (int[]){31,32,33,34},
                };
这是指向int的指针的数量数组。这些指向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]);
}
int*ar2[NUM_行];
对于(int i=0;i
下面的声明不正确

int *ar2[NUM_COLS]={
                (int[]){11,12,13,14},
                (int[]){21,22,23,24},
                (int[]){31,32,33,34},
                };
这是指向int的指针的数量数组。这些指向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]);
}
int*ar2[NUM_行];
对于(int i=0;i
此初始化是正确的;复合文字的生存期与在其中声明的块相匹配。在这种情况下,文字的生存期与
ar2
相同


但是,我建议使用dbush答案中的简单数组,除非您有一些额外的要求(例如需要不同长度的行)。

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



但是,我建议使用dbush答案中的简单数组,除非您有一些额外的要求(例如需要不同长度的行).

什么让你认为它不正确?我无法重现你在valgrind下报告的系统问题。你得到了什么具体错误?NUM_COLS是4,你只初始化了三列。我没有任何问题,代码工作正常。我这里的唯一要点是将类型转换为(int[]){}初始化时需要,并想知道是否有其他方法可用available@Rajesh没有类型转换,这是一个复合文字。类型转换在括号中有一个类型名,后跟一个表达式。你为什么认为它不正确?我无法在valgrind下重现你在我的系统上报告的问题。具体错误是什么你得到的?NUM_COLS是4,你只初始化了三列。我没有任何问题,代码工作正常。我这里的唯一要点是类型转换到(int[]){}初始化时需要,并想知道是否有其他方法可用available@Rajesh没有类型转换,这是一个复合文本。类型转换在括号中有一个类型名,后跟一个表达式。原始代码是正确的(虽然不是很好的样式),块作用域中复合文字的存储持续时间是最内层封闭块的作用域(即,在这种情况下与
ar2
的作用域相同).另外,不要投malloc@M.MOP代码中复合文字的存储持续时间不限于最里面的封闭块=它们所在的初始值设定项列表吗?如果是,这个答案在这方面是正确的-分配没有“正确”完成因为复合文本将立即超出范围。如果结果未定义,为什么GCC中不会生成警告?我使用的是MnGW32。@Lundin括号内的初始值设定项列表不是blocks@M.M:我认为你应该合并并以单独的答案结束,这样它才能被接受。看,复合文字可以是左值,也可以是左值因此,OP的代码看起来是有效的。web上与这种初始化形式相关的帖子非常有限,我想这篇帖子可以作为链接指针初始化数组和复合文字概念的很好参考。原始代码是正确的(虽然不是很好的风格),块作用域中复合文字的存储持续时间是最内层封闭块的作用域(即,在这种情况下与
ar2
的作用域相同).另外,不要投malloc@M.MOP代码中复合文字的存储持续时间不限于最里面的封闭块=它们所在的初始值设定项列表吗?如果是,这个答案在这方面是正确的-分配没有“正确”完成,因为复合文字会立即消失