C: Verständnisfrage Funktionsaufruf

lordosiris

Mitglied
Hallo,

hab fast direkt noch eine andere Frage.

Und zwar hab ich hier ein klitzekleines Programm, dessen Output ich aber absolut nicht verstehen will.

Es besteht auf der einen Seite natürlich aus dem main Teil (int max, char **hubert). Darin wird ein int a initialisiert, danach eine funktion mit (*++hubert); aufgerufen, dem int a wird dann 1 zugewiesen, danach wird a noch ausgegeben ("Wert = a") und mit return exit_status das ganze beendet.
5 Zeilen im Main Programm.

Diese Funktion, die aufgerufen wird, ist der zweite Teil (bzw. steht hald davor).
void funktion(char *array); darin wird int a mit 5, int b mit 7, char puffer[5] erstellt. Danach wird der string array in puffer kopiert. Und abschließend wird puffer, a, b ausgegeben.

Aber ich verstehe die Ausgabe nicht.
Wenn man im Parameter HALLO übergibt, ist die Endausgabe: HALLO 5 7, Wert = 1;
Bei HALLO123 Eingabe, Ausgabe: HALLO123 5 0, Wert=1; Hier wurde der 7er schonmal zu einem 0er****
Bei HALLO12345678 Eingabe, Ausgabe: HALLO12345678 56 926299444, Wert = 1;
Bei HALLO123456789ABCD, Ausgabe: HALLO123456789ABCD 1111570544 926299444, SPEICHERZUGRIFFSFEHLER (statt Wert);

Ab HALLO12345678 steig ich komplett aus.

Ich hab mir das mittlerweile soweit zusammengereimt, dass der Aufruf der Funktion mit (*++hubert) was damit zu tun hat.
Was bezwecken diese zwei ++ vor dem char wert, der dann als array in den puffer kopiert wird?
Was bezwecken die zwei ** bei int main(int max, char **hubert)?

Bin leider absoluter C Neuling
 
Hi

willst du uns bitte auch mal den konkreten Code zeigen?
Btw, warum heißt die Variable "hubert"? :D

++ erhöht die Variable um 1, bevor sie verwendet wird.
Man könnte statt ++ auch in der Zeile davor ...=...+1 schreiben

** ist ein Array aus Arrays.
 
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int arr[5][5] = {{1},{2,3}}; 

void funktion(char *array) {
	int a = 5;
	int b = 7; 
   	char puffer[5]; 
   
	strcpy(puffer, array);
	printf("%s %d %d\n",puffer, a, b);
}
int main(int max, char **hubert) {
	int a;
   	funktion(*++hubert);
   	a=1;
   	printf("wert = %d\n",a);
   	return EXIT_SUCCESS;
}

Warum die hubert heißt, weiß ich leider nicht, ich wills nur verstehen :)
 
Der übergebene String darf hier max. 4 Zeichen haben (mit der \0 sinds 5).
HALLO ist also schon zu viel.
Vergrößere puffer.

Zum main:
Die Sache mit a dürfte klar sein.
*++hubert ist das Gleiche wie hubert[1], also "HALLO" oder was drin ist.

Und die Funktion ist eigentlich auch einfach...


Das Programm schaut danach aus, dass puffer absichtlich so klein ist.
strcpy geht dann über das puffer-Ende raus und überschreibt Speicher,
in dem irgendwas Anderes ist.
Deswegen die komischen Werte der ints bei der Ausgabe, die waren "im Weg".

Und der Speicherfehler, weils irgendein Codeteil erwischt hat.
 
Du hast eine Puffer, der maximal 5 Zeichen speichern kann, gibst aber mehr ein. Das kann ja nicht gut gehen. Erhöhe den Array auf 512 und probier's nochmal.
Und das **hubert ist dasselbe wie ein char *hubert[], wenn es so verständlicher ist.


cwriter

/Edit
Schon wieder zu spät :mad:
 
Hab mal probeweiser den Wert des Puffers auf 512 erhöht.
Nun ist die Ausgabe bis HALLO123456789ABCD immer zuerst der Parameter, dann 5 7, wert = 1.

Soweit so gut, dass der Char mit 5 zu klein ist und alles nach HALLO nichtmehr aufnimmt, war mir schon bewusst.

Aber wie kommt es dennoch zu der komischen Ausgabe?
Der Speicherfehler wegen einem erwischen Codeteil?
Wieso gehts bis HALLO12345678 und bei HALLO123456789ABCD geht's plötzlich nichtmehr?
 
Du greifst auf Speicher zu, der vom System nicht erlaubt wurde. Es ist reines Glück, dass vorher noch nichts passiert. Dabei liest du Speicher, der dir nicht gehört -> Seg. Fault.
 
Wovon ist dieses Glück abhängig?

Wenn ich das auf einem Leistungsstärkeren Rechner mache, geht das die Ausgabe z.b. bis HALLO123456789ABCD, bei meinem Notebook aber nur bis HALLO123.

Und welche Ziffern werden da also ausgegeben? Also nach dem Namen, den ich als Parameter übergeben habe?
 
64/32 bit. 32bit =4 Byte, 64 bit = 8byte pointer. 64bit ist grösser.

Die andere Frage habe ich nicht verstanden.

cwriter
 
Bei HALLO12345678 Eingabe, Ausgabe: HALLO12345678 56 926299444, Wert = 1;

Hier gibt er also aus:
HALLO12345678 (genau nochmal den Parameter), 56 (hier WÄRE a aber 5), 926299444 (hier wäre b aber 7).

Woher kommen diese komischen Zahlen?
 
Zurück