-7

Wie kann ich einem Array dynamisch Speicher zuweisen (2D)?Wie kann ich ein dynamisch zugewiesenes Array erstellen? C

int arr[n]; 

Wenn ich mehr oder weniger Speicher benötigen, wird die dynamische Zuordnung mehr suitable.How sein kann ich tun es in C?

+0

https://www.google.com/search?q=c+dynamic+ Array – Biffen

+1

Haben Sie jemals von ['malloc'] (http://en.cppreference.com/w/c/memory/malloc) und [' free'] gehört (http://en.cppreference.com/w/c/speicher/frei)? –

Antwort

2

Angenommen, Sie die Anzahl der Zeilen „r“ haben und die Anzahl der Spalten „c“, Sie können dies tun:

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

dies ermöglicht eine dynamische Zuweisung ein Array von Zeigern auf ganze Zahlen, und dann ordnet Arrays Ganzzahlen für jeden Zeiger. Vergessen Sie nicht, dynamisch zugewiesenen Arrays zu löschen, wenn Sie fertig sind, in diesem Fall, dass Sie die Integer-Arrays zuerst löschen sollten und dann den Zeiger-Array:

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

Das ist also nicht "ein" Array, sondern "1 + Zeilen * Spalten" Arrays. – alk

+0

So funktioniert C, Sie können "ein 2D-Array" nicht dynamisch zuweisen. Da statisch zugewiesene 2D-Arrays (mxn) tatsächlich als ein 1D-Array mit der Länge m * n zugewiesen werden und dann auf dieses Array wie arr [i] [j] zugreifen, greift es auf die Speicherposition [i * n + j], aber seit Der Compiler erkennt nicht "n", wenn das Array dynamisch zugewiesen ist, Sie können es nicht als ein Array zuweisen, wenn Sie nicht darauf zugreifen können als arr [i] [j] –

+0

"* Sie können nicht dynamisch zuteilen "ein 2D-Array" * "Sie können! :-) Vielleicht möchten Sie sich meine Antwort ansehen. – alk

1

Definieren Sie einen Zeiger auf ein Array und wie viel Speicher zugewiesen es definiert ist, um darauf hinzuweisen:

#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; 
} 

Wenn die C-Implementierung in Gebrauch unterstützt VLAs man alternativ kann:

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


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

    ... 
Verwandte Themen