инициализация массива указателей на целые числа - PullRequest
0 голосов
/ 26 июня 2018

Я пытался инициализировать и вывести массив указателей на целые числа.Является ли этот метод инициализации правильным или любой другой метод доступен для инициализации, когда мы объявляем его как массив указателей.В любом случае мы также можем использовать традиционный массив массивов 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 голосов
/ 26 июня 2018

Это объявление ниже является неправильным.

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

Это массив NUM_COLS указателей на целые числа.Память этих указателей на целые не будет правильно распределена таким образом, и приведет к неопределенному поведению .

Если вы хотите выделить весь массив в стеке, вы могли бы сделать что-токак это:

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

Если вы хотите, чтобы указатели на целочисленные значения указателей были в куче, вы должны использовать 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]);
}
0 голосов
/ 27 июня 2018

Эта инициализация верна;составные литералы имеют время жизни, соответствующее блоку, в котором они объявлены. В этом случае литералы имеют то же время жизни, что и ar2.

Однако я бы порекомендовал использовать простой массив, как в ответе dbush, если у вас нет дополнительныхтребование (например, наличие строк разной длины).

0 голосов
/ 26 июня 2018

Поскольку вы знаете количество строк и столбцов, вы можете определить двумерный массив (формально массив массивов) вместо массива указателей:

int ar2[NUM_ROWS][NUM_COLS]={
    {11,12,13,14},
    {21,22,23,24},
    {31,32,33,34},
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...