C → Arrays vs. Zeiger

Um die unterschiedliche Bedeutung von Arrays und Zeigern zu verstehen, habe ich mir mal folgenden Code zusammengebastelt und im Disassembly analysiert:

ptr_array_1.c

#include <stdio.h>
 
int main() {
 char carray[3]  = {'a', 'b', 'c'};
 int  iarray[3]  = {1,2,3};
 char *c         = "abc";
 return 0;
}

In der Fachliteratur wird keine Möglichkeit ausgelassen um darauf hinzuweisen, dass Arrays keine Zeiger sind. Zugegeben, ich wär in der ersten Überlegung auch nicht darauf gekommen, dass es Zeiger sein könnten. Demnach habe ich mir mal Zeiger und Arrays genauer angeschaut:

(gdb) disas main
...
0x0804839a <main+6>:	mov    BYTE PTR [ebp-0xb],0x61
0x0804839e <main+10>:	mov    BYTE PTR [ebp-0xa],0x62
0x080483a2 <main+14>:	mov    BYTE PTR [ebp-0x9],0x63
0x080483a6 <main+18>:	mov    DWORD PTR [ebp-0x18],0x1
0x080483ad <main+25>:	mov    DWORD PTR [ebp-0x14],0x2
0x080483b4 <main+32>:	mov    DWORD PTR [ebp-0x10],0x3
0x080483bb <main+39>:	mov    DWORD PTR [ebp-0x8],0x8048490
...

Interessant sind hierbei die Zeilen <main+6>, <main+10>, <main+14> und die Zeile <main+39>. In den ersten drei Zeilen wird das »carray« initialisiert. Man erkennt, dass das Array in lauter Zeiger zerfällt, welche auf jeweils ein Element des Arrays zeigen. Dagegen wird in der Zeile, wo der char-Zeiger »c« initialisiert wird, nur die Adresse 0x8048490 übergeben, in der der Inhalt steht:

(gdb) x/s 0x8048490
0x8048490:	 "abc"

pronto 2011/12/11 15:04

tux/arrays_vs_pointer.txt (6955 views) · Zuletzt geändert: 2011/12/15 19:51 von wikisysop
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0