C-Funktion liefert const-Zeiger zugeordnet ist, nonconst-Zeiger - Warnung kein Fehler
#include <stdio.h>
#include <stdlib.h>
const int * func()
{
int * i = malloc(sizeof(int));
(*i) = 5; //initialize the value of the memory area
return i;
}
int main()
{
int * p = func();
printf("%d\n", (*p));
(*p) = 3; //attempt to change the memory area - compiles fine
printf("%d\n", (*p));
free(p);
return 0;
}
Warum tut der compiler zulassen, mich zu ändern (*p)
auch wenn func()
gibt einen const pointer?
Ich bin mit dem gcc, es zeigt nur eine Warnung auf der int * p = func();
Zeile : "warning: initialization discards qualifiers from pointer target type".
Dank.
- Es gibt einen Weg, um der compiler zeigt einen Fehler, anstatt diese Warnung?
-pedantic-errors
oder-Werror
.- Was OP zurückgegeben war nicht ein const-Zeiger, sondern ein Zeiger auf const(oder nur Lesen) Objekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihr Programm ist nicht gültig. C verbietet implizit entfernen
const
wie, und in übereinstimmung mit der spec-GCC sollte Ihnen zumindest eine Warnung für diesen code. Sie müssten eine Besetzung zu entfernen, dieconst
.Dass verbraucht eine Warnung für das, können Sie jedoch verlassen sich auf die Programm zu arbeiten (wenn auch nicht mehr aus normativer Sicht), da der Zeiger verweist auf einen malloc ' ed Speicherbereich. Und man darf schreiben, dass Bereich. Ein
const T*
verweist auf Speicher bedeutet nicht, dass der Speicher ist danach gekennzeichnet unveränderlich.Beachten Sie, dass der Standard nicht erforderlich, einen compiler zu verweigern Programm. Der Standard erfordert lediglich Compilern manchmal senden eine Nachricht an den Benutzer. Ob das nun ein warn-oder Fehlermeldung und wie Sie die Nachricht emittiert wird, und was auch immer danach geschieht-emission, nicht durch die Norm festgelegten an alle.
Den compiler und die C-Sprache "erlauben" Sie machen allerlei Dummheiten, vor allem, wenn Sie Warnungen ignorieren. Die Umwandlung einer
const int*
zuint*
ist der einzige Punkt, an dem der compiler erkennen kann, dass es etwas gibt, was hier faul, und es hat eine Warnung ausgegeben, die für diese Konvertierung. Das ist so viel Ablehnung, wie Sie erhalten, und es ist, warum sollten Sie nicht ignorieren Warnungen.Da das Verhalten des Programms definiert ist (durch GCC zu derselben, als hättest du explizit casten zu
const int*
), ist es zumindest möglich, dass das, was Sie getan haben, ist wirklich, was Sie tun sollen. Das ist, warum der code akzeptiert wird.Wenden Sie eine
const
- Zeiger in einen normalen Zeiger, die würde im wesentlichen ermöglichen Ihnen das ändern der Zeiger. Brechen Sie den "Vertrag" den du gemacht indem du ein konstanter Zeiger, aber da C ist eine schwach typisierte Sprache ist syntaktisch legal.Grundsätzlich GCC ist, hilft Sie hier. Syntaktisch ist es legal zu machen
const
Zeiger in eine reguläre, aber die Chancen sind Sie nicht wollen, zu tun, damit der GCC wirft eine Warnung.Lesen design by contract.
erste von allen, der Speicher ist gültig im main, da es auf dem heap gespeichert ist und noch nicht zerstört worden ist,/befreit. Damit der compiler nur beklagen, eine Warnung an Sie.
Wenn Sie versuchen
dann natürlich
(*p) = 3
Fehler.