Hallo,
ich habe leider ein Verständnisproblem bei der Speicheraddressierung dynamischer Arrays in C: Und zwar versuche ich mit einem einzigen Pointer Elemente eines Arrays anzusprechen. Mir ist dabei aufgefallen, dass am Ende jeder "Zeile" ein zusätzlicher Speicherplatz zu existieren scheint.
An sich sollte doch durch die im folgenden Beispiel verwendete Methode, zur Erstellung dynamischer Arrays, zunächst ein einzelner Pointer erstellt werden, der wiederum auf ein Array von Pointern zeigt und jene wiederum auf die eigentlichen Zahlen. Die Zahlen sollten doch auch zusammenhängend im Speicher liegen und mit einem einzelnen Pointer ansprechbar sein, oder liegt hier schon mein Fehler?
Mein Problem erkennt man am besten an folgendem minimal Beispiel:
Wenn ich das Program ausführe bekomm ich folgenden output:
erhalte ich:
Des ganze verwirrt mich irgendwie
Vielen Dank für die Antworten schonmal im Vorraus!
zur Info ich verwende ubuntu 13.10 und gcc-4.8.1
ich habe leider ein Verständnisproblem bei der Speicheraddressierung dynamischer Arrays in C: Und zwar versuche ich mit einem einzigen Pointer Elemente eines Arrays anzusprechen. Mir ist dabei aufgefallen, dass am Ende jeder "Zeile" ein zusätzlicher Speicherplatz zu existieren scheint.
An sich sollte doch durch die im folgenden Beispiel verwendete Methode, zur Erstellung dynamischer Arrays, zunächst ein einzelner Pointer erstellt werden, der wiederum auf ein Array von Pointern zeigt und jene wiederum auf die eigentlichen Zahlen. Die Zahlen sollten doch auch zusammenhängend im Speicher liegen und mit einem einzelnen Pointer ansprechbar sein, oder liegt hier schon mein Fehler?
Mein Problem erkennt man am besten an folgendem minimal Beispiel:
Code:
#include <stdio.h>
#include <stdlib.h>
#define RD_ZEILEN 4
#define RD_SPALTEN 3
int main (int argc, char *argv[])
{
int i,j,n;
double** rd = (double**)malloc( RD_ZEILEN * sizeof(double*));
for (i=0; i<RD_ZEILEN; i++) rd[i] = (double*)malloc( RD_SPALTEN * sizeof(double) );
n=1;
double* p= &(rd[0][0]);
for (i=0; i < RD_ZEILEN*RD_SPALTEN; ++i){
*p++ = n++;
}
for (i=0; i < RD_ZEILEN; i++){
for (j=0; j < RD_SPALTEN; j++)
printf("%.0f\t", rd[i][j] );
printf("\n");
}
return 0;
}
Verändere ich die Ausgabe auf:1 2 3
5 6 7
9 10 11
13 14 15
Code:
for (i=0; i < RD_ZEILEN; i++){
for (j=0; j < RD_SPALTEN+1; j++){
printf("%.0f\t", rd[i][j] );
}
printf("\n");
}
An sich würde ich denken, dass die einzelnen "Zeilen" nun "random" im Speicher angelegt werden und man eben nicht so einfach mit einem einzelnen Pointer durch das Array gehn kann. Aber warum ist ausgerechet nur ein Speicherplatz jeweils zwischen den "Zeilen" und warum gibt es keine Speicherzugriffsfehler?1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Des ganze verwirrt mich irgendwie
Vielen Dank für die Antworten schonmal im Vorraus!
zur Info ich verwende ubuntu 13.10 und gcc-4.8.1