Kleines C Programm |
C Programmierer unregistriert
|
|
Guten Morgen allerseits,
ich verstehe folgendes Programm nicht [das ich selbst programmiert habe
]:
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?
|
|
27.12.2011 01:24 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
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
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Karlito: 29.12.2011 00:04.
|
|
28.12.2011 20:21 |
|
|
|