Kleines C Programm

Neue Frage »

Auf diesen Beitrag antworten »
C Programmierer Kleines C Programm

Guten Morgen allerseits,

ich verstehe folgendes Programm nicht [das ich selbst programmiert habe großes Grinsen ]:

Zitat:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
char z[2];
sprintf(z, "peace");
z[3]=toupper(z[3]);
printf("%s\n", z);


system("PAUSE");
return 0;
}


Es fängt bei char z[2] an. Was genau mach ich mit diesem Befehl? Nun gut, ich definiere einen string z. Doch wofür steht die 2? Ich dachte eigentlich bisher, dass die 2 für die Anzahl der Elemente, also der Buchstaben stehen würde. Aber dann fülle ich doch den string mit sprintf(z, "peace") aus, und peace besteht aus 5 Buchstaben. Dies klappt alles ohne Probleme, hä was?
 
Auf diesen Beitrag antworten »
Karlito

Hallöchen,

dein Programm funktioniert nur, weil wie es scheint der Platz für ein Char-Array immer in einem größeren Abstand, bei mir 16 Byte-Weise, reserviert wird.

Ich habe hier mal ein Beispielprogramm:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	char z[2];  //Dein altes Array
	char y[50]; //Dieses Array wird hinter dem ersten Array angelegt
	sprintf(z, "zu viel peace macht das hirn matschig"); //mal ein längerer Text
	z[16]=toupper(z[16]);
	printf("Adresse des Anfangs von Array z: %p\n", z);
	printf("Adresse des Anfangs von Array y: %p\n", y);
	printf("Array z als String interpretiert: %s\n", z);
	printf("Array y als String interpretiert: %s\n", y);


	system("PAUSE");
	return 0;
}


Dieses Funktioniert auch noch. Man sieht aber, dass du mit in den Speicherbereich des 2. Arrays reinschreibst. Lässt du das Zweite Array weg, bekommst du einen Speicherzugriffsfehler.

C prüft nicht, ob du die Länge eines Arrays überschreitest. Das ist auch eine der Gefahren beim C-Programmieren. Je besser du dir sowas klar machst, desto weniger läufst du in irgendwelche Fallen.

Hier noch mal das Programm mit dem Speicherzugriffsfehler:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	char z[2];  //Dein altes Array
	sprintf(z, "zu viel peace macht das hirn matschig"); //hier sollte dir das ganze schon um die Ohren fliegen
	z[16]=toupper(z[16]);
	printf("Adresse des Anfangs von Array z: %p\n", z);
	printf("Array z als String interpretiert: %s\n", z);


	system("PAUSE");
	return 0;
}


Ein wichtiger Hinweis noch: printf Strings sind in C mit 0 Terminiert. D.h. Die das Char-Array muss immer ein Byte länger sein als die Zeichenkette!

Hier ein Beispielprogramm:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	char z[10]; 
	sprintf(z, "peace");
	z[3]=0x00; //vorzeitige 0, hier wird der String terminiert!
	printf("Array z als String interpretiert: %s\n", z);

	system("PAUSE");
	return 0;
}


Wenn da noch Probleme beim Verständnis sind, gerne noch mal nachfragen.

Viele Grüße,

Karlito
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »