Diverse Fragen zu Pointern

17/08/2008 - 10:59 von Tom Seidel | Report spam
Moin!

Ich entschuldige mich schon jetzt dafür so viele Fragen zu stellen, aber ich
finde leider nirgends eine Antwort:

1. Folgendes Progràmmchen ist gegeben:

int main(int argc, char **argv) {
char *ptr;
ptr = "TEST";
printf("Inhalt: %s", ptr);
return 0;
}

Warum kompiliert und làuft dieser Code ohne Probleme? ptr ist doch ein
Pointer und verweist doch auf eine Speicheradresse und diese
Speicheradresse wird doch hier durch "TEST" überschrieben?

Warum muss hier im übrigen auch kein Speicher vorher mit malloc() alloziert
werden, also ptr = (char *) malloc(sizeof(char) * strlen("TEST"))?

2. Jetzt hàtte ich noch eine Frage: Ich habe eine Funktion deren Signatur
folgendermaßen aussieht

void func(int arg1, char **output)
output[0] = sprintf("Ergebnis: %d", 1 * arg1);
output[1] = sprintf("Ergebnis: %d", 2 * arg1);
output[2] = sprintf("Ergebnis: %d", 3 * arg1);
}

Wie initialisiere ich nun char** output vor der Übergabe an die Funktion
richtig, damit ich keinen Speicherzugriffsfehler erhalte?

Danke für die Antworten!

Tom
 

Lesen sie die antworten

#1 Claudio Carobolante
17/08/2008 - 11:50 | Warnen spam
Tom Seidel schrieb:

1. Folgendes Progràmmchen ist gegeben:

int main(int argc, char **argv) {
char *ptr;
ptr = "TEST";
printf("Inhalt: %s", ptr);
return 0;
}

Warum kompiliert und làuft dieser Code ohne Probleme? ptr ist doch
ein Pointer und verweist doch auf eine Speicheradresse und diese
Speicheradresse wird doch hier durch "TEST" überschrieben?



ptr ist ein Bezeichner für ein Objekt, dass einen char-pointer (eine
Adresse) speichern kann. Mit der Anweisung 'ptr = "TEST";' wird in
diesem Objekt die Adresse des Stringliterals (der Wert des Ausdrucks
"TEST") geschrieben.

Zum Vergleich:

int a;
a = 5;

a ist ein Bezeichner für ein Objekt, dass einen Integer speichern
kann. Mit der Anweisung 'a = 5;' wird in diesem Objekt der Wert der
Integerkonstanten (der Wert des Ausdrucks 5) geschrieben.

Warum muss hier im übrigen auch kein Speicher vorher mit malloc()
alloziert werden,



Weil der Kompiler den entsprechenden Platz für das Literal reserviert.
Wo er das Literal speichert, ist nicht vorgeschrieben. Der Kompiler
darf das Literal auch in einem dann schreibgeschützten Bereich
speichern. Aus diesem Grund soll ein Literal als vom Typ 'const
char*' betrachtet werden, obwohl es tatsàchlich den Typ 'char*' hat.

Weil wir es jetzt schon lànger nicht mehr hatten: ;)

also ptr = (char *) malloc(sizeof(char) * strlen("TEST"))?



Wenn, dann: prt = malloc(strlen("TEST") + 1);
In letzte Konsequenz: prt = malloc(5);

Der Cast ist überflüssig, sizeof(char) ist immer 1 und für das
abschließende Null-Byte braucht es auch Platz.

2. Jetzt hàtte ich noch eine Frage: Ich habe eine Funktion deren
Signatur folgendermaßen aussieht

void func(int arg1, char **output)
output[0] = sprintf("Ergebnis: %d", 1 * arg1);
output[1] = sprintf("Ergebnis: %d", 2 * arg1);
output[2] = sprintf("Ergebnis: %d", 3 * arg1);
}

Wie initialisiere ich nun char** output vor der Übergabe an die
Funktion richtig, damit ich keinen Speicherzugriffsfehler erhalte?



Na erstmal, wie benutze ich sprintf richtig? So jedenfalls nicht. C
ist nicht PHP und sprintf hat eine andere Signatur als Du hier zu
verwenden versuchst.

Zur eigendlichen Frage:

char *output[3];

Bei Deinem Beispiel müsste anschließend noch hinreichend Platz für die
einzelnen Zeiger reserviert werden.

Danke für die Antworten!



Gerne.

cc

Ähnliche fragen