-7

Как я могу распределить память на массив динамически (2D)?Как создать динамически выделенный массив В C

int arr[n]; 

Если мне нужно больше или меньше памяти, динамическое распределение будет более suitable.How я могу сделать это в C?

+0

https://www.google.com/search?q=c+dynamic+ массив – Biffen

+1

Вы когда-нибудь слышали о ['malloc'] (http://en.cppreference.com/w/c/memory/malloc) и [' free'] (http://en.cppreference.com/w/c/память/бесплатно)? –

ответ

2

Если у вас есть количество строк «г» и число столбцов «с», вы можете сделать это:

int **arr; 
arr = malloc(r*sizeof(int*)); 
for(int i=0; i < r; i++) 
{ 
    arr[i] = malloc(c*sizeof(int)); 
} 

это динамически выделяет массив указателей на целые числа, а затем выделяет массивы целые числа к каждому указателю. Не забудьте удалить динамически выделенные массивы, когда вы сделали, в этом случае вы должны удалить целые массивы, а затем массив указателей:

for(int i=0; i < r; i++) 
{ 
    free(arr[i]); 
} 
free(arr); 
+0

Итак, это не «один» массив, а массивы «1 + rows * columns». – alk

+0

Вот как работает C, вы не можете динамически выделять «один 2D-массив». Поскольку статически выделенные 2D-массивы (mxn) фактически выделяются как 1D-массив длины m * n, а затем при обращении к этому массиву, например arr [i] [j], он обращается к положению памяти [i * n + j], но поскольку компилятор не знает о «n», когда массив динамически распределен, вы не можете назначить его как один массив, если вы не можете получить к нему доступ, как arr [i] [j] –

+0

«* вы не можете динамически выделить «один 2D-массив» * «вы можете! :-) Вы могли бы взглянуть на мой ответ. – alk

1

Определить указатель на массив и выделенный столько памяти, что определяются, чтобы указать:

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


#define ROWS (5) 
#define COLUMNS (7) 


int main(void) 
{ 
    /* Define and initialise the pointer to the array. */ 
    int (*p)[ROWS][COLUMNS] = malloc(sizeof *p); 

    if (NULL == p) 
    { 
    perror("malloc() failed"); 
    return EXIT_FAILURE; 
    } 

    /* Initialize the array's members. */ 
    { 
    size_t r, c; 

    for (r = 0; r < ROWS; ++r) 
    { 
     for (c = 0; c < COLUMNS; ++c) 
     { 
     (*p)[r][c] = r * c; 
     } 
    } 
    } 

    /* Print the array's members' values. */ 
    { 
    size_t r, c; 

    for (r = 0; r < ROWS; ++r) 
    { 
     for (c = 0; c < COLUMNS; ++c) 
     { 
     printf("array[%zu][%zu] = %d\n", r, c (*p)[r][c]); 
     } 
    } 
    } 

    /* Free the array. */ 

    free(p) 

    return EXIT_SUCCESS; 
} 

Если реализация C в использовании поддерживает Влас один вариант, может сделать:

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


int main(void) 
{ 
    size_t ROWS = 5; 
    size_t COLUMNS = 7; 

    ... 
Смежные вопросы