Spielerei mit Pointern in C
-
Hallo, ich versuche gerade Zeiger ein bisschen zu üben und weiß nicht mehr weiter. Das Programm liefert einfach nur nichts. Es ist ein simples aber verkompliziertes Programm für die Binärwandlung.
Hoffe auf eure Unterstützung
#include <stdio.h> #include <stdlib.h> char *dez2bin(int *dezimal); int main(int argc, char *argv[]) { int dezimalzahl, i; char *dual; printf("Gebe eine dezimale Zahl ein: "); scanf("%d", &dezimalzahl); dual = dez2bin(&dezimalzahl); printf("Groesse: %d Zeichen\n\n", (sizeof(dual)/sizeof(char))); for(i=(sizeof(dual)/sizeof(char)); i>0; i--) printf("%c", dual[i]); printf("\n\n"); system("PAUSE"); return 0; } char *dez2bin(int *dezimal) { char *tmp; tmp = malloc(1*sizeof(char)); while(*dezimal > 0 ) { if ( *dezimal % 2 == 0) { *tmp = '0'; tmp = realloc(tmp, 1 + sizeof(char)); *tmp = *(tmp+1); *dezimal = *dezimal / 2; } else { *tmp = '1'; tmp = realloc(tmp, 1 + sizeof(char)); *tmp = *(tmp+1); *dezimal = *dezimal / 2; } } return tmp; free(tmp); }
UPDATE
#include <stdio.h> #include <stdlib.h> char *dez2bin(int *dezimal); int main(int argc, char *argv[]) { int dezimalzahl, i; char *dual; printf("Gebe eine dezimale Zahl ein: "); scanf("%d", &dezimalzahl); dual = dez2bin(&dezimalzahl); printf("Groesse: %d Zeichen\n\n", (sizeof(dual)/sizeof(char))); for(i=(sizeof(dual)/sizeof(char)); i>0; i--) printf("%c", dual[i]); printf("\n\n"); system("PAUSE"); return 0; } char *dez2bin(int *dezimal) { char *tmp; int i = 1; tmp = malloc(1*sizeof(char)); while(*dezimal > 0 ) { if ( *dezimal % 2 == 0) { tmp[i-1] = '0'; i++; tmp = realloc(tmp, i * sizeof(char)); *dezimal = *dezimal / 2; } else { tmp[i-1] = '1'; i++; tmp = realloc(tmp, i * sizeof(char)); *dezimal = *dezimal / 2; } } return tmp; free(tmp); }
Edit: dezimalzahl als Referenz mitgegeben!
-
char *t; sizeof(t);
Dies gibt dir NICHT die Anzahl an Zeichen in der Zeichenkette wieder, wie du es offensichtlich glaubst. sizeof gibt dir die größe des Datentyps in byte wieder, und der Datentyp ist ein char-Zeiger.
-
hallo,
mit pointern spielt man nicht. mit solchen sperenzchen kannste dir deine hardware zerscheissen.
-
ess schrieb:
mit solchen sperenzchen kannste dir deine hardware zerscheissen.
Schwachsinn.
-
Janjan schrieb:
char *t; sizeof(t);
Dies gibt dir NICHT die Anzahl an Zeichen in der Zeichenkette wieder, wie du es offensichtlich glaubst. sizeof gibt dir die größe des Datentyps in byte wieder, und der Datentyp ist ein char-Zeiger.
Hallo Janjan, da hast du vollkommen Recht. Ich hatte es mit Arrays so gelernt z.B.:
int tmp[] = { 34, 35, 36, 37 }; printf("Anzahl der Elemente: %d", sizeof(tmp)/sizeof(int));
Und da ein Array eigentlich auch nichts weiter ist als verbundene Pointer
*p = tmp[0]
*(p+1) = tmp[1]Also doch eine eigene Funktion
hallo,
mit pointern spielt man nicht. mit solchen sperenzchen kannste dir deine hardware zerscheissen.
Darf ich dem wirklich glauben?
-
3dprogger schrieb:
Janjan schrieb:
char *t; sizeof(t);
Dies gibt dir NICHT die Anzahl an Zeichen in der Zeichenkette wieder, wie du es offensichtlich glaubst. sizeof gibt dir die größe des Datentyps in byte wieder, und der Datentyp ist ein char-Zeiger.
Hallo Janjan, da hast du vollkommen Recht. Ich hatte es mit Arrays so gelernt z.B.:
int tmp[] = { 34, 35, 36, 37 }; printf("Anzahl der Elemente: %d", sizeof(tmp)/sizeof(int));
Das funktioniert mit statischen Arrays, ja. char* ist aber kein Array, sondern ein Zeiger.
3dprogger schrieb:
Und da ein Array eigentlich auch nichts weiter ist als verbundene Pointer
*p = tmp[0]
*(p+1) = tmp[1]Der Zugriff auf Arrays und auf Zeiger ist identisch, nicht jedoch die Typen. Weitere Informationen gibt es hier: http://c-faq.com/aryptr/index.html
3dprogger schrieb:
hallo,
mit pointern spielt man nicht. mit solchen sperenzchen kannste dir deine hardware zerscheissen.
Darf ich dem wirklich glauben?
Wie gesagt, das ist absoluter Schwachsinn.
-
Ok Danke Schön. Habe das Problem nun gelöst.
-
Also theoretisch möglich ist das schon, mit solcher Spielerei die Hardware zu zerstören. Aber es ist sehr unwahrscheinlich, weil es sehr spezielle Anweisungen sind. Und moderne Betriebssysteme lassen solchen Unsinn gar nicht erst zu. Und die nötige Hardware ist heutzutage eher exotisch. Aber das ist ja alles nicht Voraussetzung für C Programme.
Beispiele:
http://en.wikipedia.org/wiki/Killer_pokeLass dich aber nicht davon abschrecken. Wie schon gesagt ist das heutzutage praktisch unmöglich.