Die letzten 2 Beiträge |
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 |
C Programmierer |
Kleines C Programm
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? |
|
|