我正在尝试初始化并打印指向整数的指针数组。 这种初始化方法是否正确,或者当我们将其声明为指针数组时,可以使用其他任何方法进行初始化。无论如何,我们也可以使用数组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);
}
答案 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的回答中那样使用简单的数组。