C quiz ;)

24/02/2009 - 12:13 von Martin Kleiner | Report spam
Hi

Ich bin auf ein paar "witzige" C Codefragmente gestossen die sich
anders verhalten als wie ich gedacht habe.
Vielleicht haette ich doch in der C Vorlesung besser aufpassen sollen!

#include "stdio.h"

main()
{
int a[10];
3[a] = 10;
printf("%d",*(a+3));
}

Dieser Code laesst sich wirklich compilieren. Es sieht so aus als ob
das 3[a] das gleiche
wie a[3] darstellt. Gibt es hierfuer eine Regel?


#include "stdio.h"

void main()
{
void *vptr = (void *) malloc(sizeof(void));
vptr++;
}

Auch das hier laesst sich ohne Fehlermeldung compilieren, und das ist
unerklaerlich fuer mich.
Ist das ein Pointer auf eine Speicherstelle mit 0 Bytes Content und
das vptr++ laesst den Pointer
einach weiterhin auf die gleiche Speicherstelle zeigen?
 

Lesen sie die antworten

#1 Florian Kreidler
24/02/2009 - 11:42 | Warnen spam
Martin Kleiner schrieb:
Hi

Ich bin auf ein paar "witzige" C Codefragmente gestossen die sich
anders verhalten als wie ich gedacht habe.
Vielleicht haette ich doch in der C Vorlesung besser aufpassen sollen!

#include "stdio.h"

main()
{
int a[10];
3[a] = 10;
printf("%d",*(a+3));
}

Dieser Code laesst sich wirklich compilieren. Es sieht so aus als ob
das 3[a] das gleiche
wie a[3] darstellt. Gibt es hierfuer eine Regel?



a[3] == &(a+3) == &(3+a) == 3[a]


#include "stdio.h"

void main()
{
void *vptr = (void *) malloc(sizeof(void));
vptr++;
}

Auch das hier laesst sich ohne Fehlermeldung compilieren, und das ist
unerklaerlich fuer mich.
Ist das ein Pointer auf eine Speicherstelle mit 0 Bytes Content und
das vptr++ laesst den Pointer
einach weiterhin auf die gleiche Speicherstelle zeigen?



Nein.
printf("%d", sizeof(void));
gibt 1 aus.

Es gab mal eine Zeit, da hatten alle "ungetypten" Speicherzellen den Typ
char. Irgendwann fand man das unschoen, weshalb der Typ void eingefuehrt
wurde. Durch sizeof(void)==1 ist sichergestellt, dass die Zeigerarithmetik
auf beiden Typen gleich funktioniert.

Ähnliche fragen