C : stack-Speicher, springen und "jump in den Bereich von Bezeichner-mit variabel modifizierten Typ",
Fand ich, dass diese weigert sich zu kompilieren :
int test_alloc_stack(int size){
if(0) goto error; //same issue whatever conditional is used
int apply[size];
give_values(apply,size);
return 1;
error:
return 0;
}
Den Fehler den ich bekomme, ist : "Sprung in den Bereich von Bezeichner-mit variabel modifizierten Typ".
Die Beseitigung der Zeile mit "goto" und der Sprung zu einem Fehler löst die Probleme.
Wenn ich die dynamische Zuordnung für Sie gelten, dann wird das problem auch verschwinden. Dies kompiliert fein:
int test_alloc_heap(int size){
if(0) goto error;
int * apply = calloc(sizeof(int),size);
give_values(apply,size);
free(apply);
return 1;
error : return 0;
}
Was ist Los ?
alloca
dieses problem nicht hat.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erklärung:
erstellt eine variable Länge array. Wenn Sie den Bereich verlässt, muss der compiler erzeugen code, der löscht die Zuweisung für das array. Sprung in den Geltungsbereich eines solchen Objektes ist verboten, ich kann mir vorstellen, da einige Implementierungen brauchen, um zu arrangieren für einige der Initialisierung, dass der clean-up-code erfordern würde, und wenn Sie einen Sprung in den Anwendungsbereich der Initialisierung würde, umgangen werden.
Wenn Sie ändern, um eine dynamische Zuordnung, die Initialisierung und Aufräumen werden in Ihrer Verantwortung, anstatt den compiler.
Ist es verboten, durch die der standard:
Das ist genau das, was Ihr
goto
tut, nämlich einen Sprung von außerhalb des Geltungsbereichs derapply
zu drin.Können Sie die folgende Problemumgehung, um den Umfang der
apply
:Ihre
goto
macht Sie überspringen die Linie, die teiltapply
(zur Laufzeit).Lösen können Sie das problem in einem der vier Möglichkeiten:
1: ändern Sie Ihren code so, dass Sie nicht springen.
2: Verschieben Sie die Erklärung der
apply
vor dergoto
.3: Ändern Sie den Bereich, so dass
error:
außerhalb desapply
:4: Ändern Sie die Deklaration von Variablen, so dass seine Größe bestimmt werden kann zur compile-Zeit.