Vollständige Version anzeigen : C: Read-ony-zeiger wird trotzdem verändert.


Gutschy
21.03.2016, 20:47

Hallo Leute,

mein Lehrbuch schreibt das ein Zeiger der als const deklariert wird nicht veränderbar ist. Wenn ich es trotzdem mache dann meckert der Compiler, aber er lässt es auch zu. Und das sollte laut meinen Buch nicht passieren können.

/* const_ptrV;c */
#include <stdio;h>
#include <stdlib;h>

void funktion1(const char *str) {
char *ptr;

ptr = str+5;
*ptr = '-';
}

int main(void) {
char string1[] = "Hallo Welt\n";

funktion1(string1);
printf("%s\n",string1);
return EXIT_SUCCESS;
}

In der Funktion funktion1 ist der Zeiger *str als Konstante gekennzeichnet. Trotzdem wird *str durch *ptr manipuliert. Wie gesagt, der Compiler gibt eine Warnung aus. Kann man dem Compiler ein anderes flag mitgeben damit er abbricht oder ähnliches?

Nachtrag:
Compeliert wird mit gcc auf Debian Wheezy.

Gruss,

Gutschy

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
ChillingStream
26.03.2016, 13:33

cs;rubick:~/Code$ ls
a;out test;c
cs;rubick:~/Code$ rm a;out
cs;rubick:~/Code$ gcc test;c -Werror
test;c: In function ‘funktion1’:
test;c:8:8: error: assignment discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
ptr = str+5;
^
cc1: all warnings being treated as errors
cs;rubick:~/Code$ ls
test;c


Wie man oben sehen kann, dem Compiler einfach den -Werror flag mitgeben.

Alternativ, guck dir mal den Code an:


/* const_ptrV;c */
#include <stdio;h>
#include <stdlib;h>

void funktion1(char *str) {
*(str+5) = '-';
}

int main(void) {
char string1[] = "Hallo Welt\n";

funktion1(string1);
printf("%s\n",string1);
return EXIT_SUCCESS;
}


und diesen:



/* const_ptrV;c */
#include <stdio;h>
#include <stdlib;h>

void funktion1(char *str) {
*(str+5) = '-';
}

int main(void) {
const char string1[] = "Hallo Welt\n";

funktion1(string1);
printf("%s\n",string1);
return EXIT_SUCCESS;
}




cs;rubick:~/Code$ gcc test;c
test;c: In function ‘main’:
test;c:12:14: warning: passing argument 1 of ‘funktion1’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
funktion1(string1);
^
test;c:5:6: note: expected ‘char *’ but argument is of type ‘const char *’
void funktion1(char *str) {
^




/* const_ptrV;c */
#include <stdio;h>
#include <stdlib;h>

void funktion1(const char *str) {
*(str+5) = '-';
}

int main(void) {
char string1[] = "Hallo Welt\n";

funktion1(string1);
printf("%s\n",string1);
return EXIT_SUCCESS;
}




cs;rubick:~/Code$ gcc test;c
test;c: In function ‘funktion1’:
test;c:6:11: error: assignment of read-only location ‘*(str + 5u)’
*(str+5) = '-';
^


Ich hoffe das macht dir deutlich, warum in deinem genauen Beispiel der Compiler nur ein bischen rummeckert anstatt sofort zu erroren, wie in meiner Anpassung


Gutschy
31.03.2016, 20:08

Hey ChillingStream,

vielen Dank für deine detaillierte Ausführung und entschuldige das ich mich erst jetzt melde, aber mein Job ist wirklich mega schlauchig.

Zu deinen Auführungen: jetzt kenne ich schon mal Werror 'Make all warnings into errors'. In deinen Beispielen willst du wohl darauf hinaus das ein String als Konstante auf keinen Fall überschrieben werden kann, ein Pointer als Konstante allerdings schon, oder?

Hoffe ich habe deinen Ausführungen so komplett nachvollzogen und noch mal vielen Dank !!! :]

Viel Grüsse,

gutschy


ChillingStream
01.04.2016, 12:26

Worauf ich eigentlich hinaus wollte ist, dass du in deinem Beispiel einen pointer erstellst, der auf einen einzelnen character Zeigt, der IN deinem character-array ist.

char *ptr; //erstelle einen pointer zu einem character

ptr = str+5; //nehme den pointer STR und springe 5 character "slots" weiter "Hello5World"
*ptr = '-'; // nun fügen wir '-' ein an der stelle wo wir hingezeigt haben -------^


prinzipiell weiß der compiler nicht, dass die stelle dort const sein soll


Gutschy
06.09.2016, 19:46

Soll das heißen, wenn ich über einen Zeiger einen einzelnen Charackter in einem String manipuliere geht das, obwohl der String eine Constante ist, vorausgesetzt das die Funktion in der er manipuliert wird ihn nicht als Constante aufruft.

Ok, das war jetzt wohl ziemlich blöd beschrieben. Aber wenn ich einen String als const deklariere, dann sollte er doch schon gar nicht über einen Zeiger manipulierbar sein, auch wenn dieser Zeiger über eine neue Funktion kommt.

Chilling Stream, großes Entschuldigung das ich mich erst nach 5 Monaten wieder melde. Ich erwarte auch ehrlich gesagt keine Antwort von dir.


Ähnliche Themen zu C: Read-ony-zeiger wird trotzdem verändert.
  • [C/C++] Zeiger
    Hallo, man hört immer von diesen schweren Zeiger kann einer möglichst einfach und eventuell mit ganz kleinem Beispiel erklären was damit gemeint ist anhand von (;de;wikipedia~org/wiki/Zeiger_(Informatik)) kann ich mir immer noch nicht vorstellen was daran nun so blöd ist oder ob ich dies als ma [...]

  • Externe Fesplatte wird erkannt aber geht trotzdem nicht!
    Hi ich habe folgendes Problem und zwar habe ich Windoof Vista Buisness. Ich hab mir ne externe Platte gekauft die angeschlossen bla bla treiber werden gesucht und installiert und es wird gesagt ist nun verwendungs möglich , doch leider wird sie mir auf dem arbeitsplatz und in der speicherverwaltun [...]

  • [Windows 7] order gelöscht wird aber trotzdem angezeigt
    hi, hab seit paar tagen erst win 7. mir ist aufgefallen, dass order im explorer noch angezeigt werden obwohl ich die glélöscht hab. f5 aktualisierung pringt nix. wähl ich den ordner an kommt natürlich ne fehlermeldung. im neuen explorer ist der ordner weg. hab das gefühl das win7 etwas [...]

  • Auslagerrungsdatei wird trotzdem genutzt
    Also ich wollte einfach mal so rumprobieren mit der auslagerrungsdatei von windows, und habe sie mal abgschalten um zu schaun wies dann läuft, und nun wollte ich gern wissen warum windows trotzdem die auslagerrung nimmt denn wo ich es ausgeschaltet habe, und im Task manager stand da immernoch unter [...]



raid-rush.ws | Imprint & Contact pr