代码之家  ›  专栏  ›  技术社区  ›  Rajesh

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

  •  0
  • Rajesh  · 技术社区  · 6 年前

    我试图初始化并打印指向整数的指针数组。 这个初始化方法是否正确,或者当我们声明它为指针数组时,任何其他方法都可以初始化。我们也可以使用传统的数组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 回复  |  直到 6 年前
        1
  •  1
  •   M.M    6 年前

    此初始化是正确的;复合文本的生存期与它们在中声明的块匹配。文字的寿命与 ar2 在这种情况下。

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

        2
  •  1
  •   dbush    6 年前

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

    int ar2[NUM_ROWS][NUM_COLS]={
        {11,12,13,14},
        {21,22,23,24},
        {31,32,33,34},
    };
    
        3
  •  1
  •   Ilan Keshet    6 年前

    以下声明不正确。

    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]);
    }