PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C]arg...ächz...Speicherzugriffsfehler



ContainerDriver
18-07-2003, 17:58
Hallo,
folgendes Prog das bei Makierung abstürzt:

#include <iostream.h>

char *to_upper(char*buffer)
{
int k=strlen(buffer);

for (int i=0;i<k;i++)
{
if (buffer[i]>='a'&&buffer[i]<='z')
{
buffer[i]-=32; //hier!!
}
}

return buffer;
}

int main(void)
{
cout << to_upper("bLAblABla") << endl;
}

MFG
FLorian

wraith
18-07-2003, 18:10
Böser Fehler.
Du übergibst die Adresse eines Strings,der in einem Read-Only-Speicherbereich liegt.
"blaalaal" ist eine konstante Zeichenkette,eigentlich dürfte man diese nicht an eine Funktion übergeben,die char* deklarriert ist,denn der String ist const char*.
Das liegt daran,daß in Pre-Standard C die Zeichenketten nicht Read-Only waren,und wegen Abwärtskompatibiltät..blabla,naja das übliche ebend :).

Den String kannst du übergeben


char str[] = "Hello World";

anda_skoa
18-07-2003, 18:21
Es empfiehlt sich, auch bei kleinen Programmen und nur schnell ausprobieren, mit -Wall zu kompilieren.

Ciao,
_

ContainerDriver
21-07-2003, 10:48
Hmmmmm, danke.
Übrigens übersetzt ich immer mit -Wall (und es gab keine Warnung).

Wenn ich nun da Array mit
char*temp="BLabLablA";
deklariere und initialisiere gehts auch nicht (mit temp[] schon).
Warum geht das nicht??


MFG
Florian

wraith
21-07-2003, 11:06
Original geschrieben von florian hanisch

Wenn ich nun da Array mit
char*temp="BLabLablA";
deklariere und initialisiere gehts auch nicht (mit temp[] schon).
Warum geht das nicht??
Das habe ich doch oben implizit bereits geschrieben.
Die Zeichenkette "Blalbla" liegt in einem Bereich,der Read-Only ist,ob du den Zeiger auf diesen Bereich nun implizit übergibst (wie in deinem ersten Bsp),oder explizit darauf einen Zeiger deklarrierst und diesen übergibst kommt aufs gleiche raus.

Du kannst den gcc auch dazu bringen,das Zeichenketten nicht Read-Only abgelegt werden,aber dieses Vorgehen wird nicht empfohlen.

Die Variante mit [] ist sicher,hier wird ein Array angelegt,und die Zeichenkette hineinkopiert.

ContainerDriver
22-07-2003, 12:40
Entschuldige meine Hartnäckigkeit,
aber ich habe in einem C++ Buch gelesen das "char*temp="hallo" & "char temp[]="hallo" identisch ist. Der Autor stellte Mutmaßungen an, dass das [] wohl gewählt wurde, um es Anfängern leichter zu machen (anstatt *).
Ist dies also falsch?

MFG
Florian

wraith
22-07-2003, 12:46
Original geschrieben von florian hanisch
Entschuldige meine Hartnäckigkeit,
aber ich habe in einem C++ Buch gelesen das "char*temp="hallo" & "char temp[]="hallo" identisch ist. Der Autor stellte Mutmaßungen an, dass das [] wohl gewählt wurde, um es Anfängern leichter zu machen (anstatt *).
Ist dies also falsch?
Ja!
Ist nicht zufällig ein Herbert Schildt Buch,oder ;) ?
Sollte man mal nachdenken,ob man nicht das Buch wechselt,allein schon der Kommentar "um es Anfängern leichter zu machen".

Und für char* temp ="blabla" kriegt man als C++ Programmierer Prügel,und nicht zu knapp,lass' das keinen C++ Guru sehen,und auch in C wird das als schlechter Stil angesehen.