Speicherreservierung
-
DirkB schrieb:
Welcher Compiler?
Reine C89-Compiler (Microsoft):
datentyp *spielfeld = malloc(b * h * sizeof(datentyp)); /* Zugriff auf Element i,j: */ spielfeld[i*h + j];
Compiler die auch C99 und neueres können (praktisch alle anderen), entweder wie oben oder auch wie folgendermaßen:
datentyp spielfeld[b][h]; // Zugriff auf Element i,j: spielfeld[i][j];
-
Mal ne blöde Frage:
Beispiel 1 holt sich den entsprechenden Speicher vom heap und Beispiel 2 klatscht das Feld auf den Stack?
-
Das ist keine blöde Frage.
Ja. Ja so ist es.
-
Ich bin unter Mac OSX mit der IDE CodeRunner am werkeln. Ich hab nämlich 9 Variablen und sobald ich ne 10 Variable mit rein bringe kommt beim ausführen "Segmentation fault" Im Internet stand dann, dass es etwas mit der Speicherreservierung zutun hat. Vielleicht kann mir ja jemand erklären was genau da falsch läuft.
Danke schonmal.
-
haggis2810 schrieb:
Vielleicht kann mir ja jemand erklären was genau da falsch läuft.
Ja: Deine Frage ist wahnsinnig ungenau und somit nicht beantwortbar.
-
#include <stdio.h> int main() { int b = 15; //x höhe int h = 15; //y breite int i; // wenn ich eine dieser beiden Variablen weglasse funktionerts int j; // wenn ich beide drin lasse kommt diese Fehlermeldung: // Run Command: line 1: 3069 Segmentation fault: 11 ./"$2" "${@:3}" int spielfeld[b][h]; int x1,y1; int x2,y2; for(x1=0;x1<b;x1++) { spielfeld[x1][y1] = 0; for(y1=0;y1<h;y1++) { spielfeld[x1][y1] = 0; } } for(x2=0;x2<b;x2++) { for (y2=0;y2<h;y2++) { printf("%d ",spielfeld[x2][y2]); } printf("\n"); y2=0; } }
-
SeppJ schrieb:
DirkB schrieb:
Welcher Compiler?
Reine C89-Compiler (Microsoft):
datentyp *spielfeld = malloc(b * h * sizeof(*spielfeld)); /* Zugriff auf Element i,j: */ spielfeld[i*h + j]; /* am Ende */ free(spielfeld);
haggis2810 schrieb:
Ich bin unter Mac OSX mit der IDE CodeRunner am werkeln. Ich hab nämlich 9 Variablen und sobald ich ne 10 Variable mit rein bringe kommt beim ausführen "Segmentation fault" Im Internet stand dann, dass es etwas mit der Speicherreservierung zutun hat. Vielleicht kann mir ja jemand erklären was genau da falsch läuft.
Danke schonmal."Segmentation fault" heißt einfach, dass du auf einen Speicherbereich zugreifen willst, der deinem Programm nicht gehört. Überprüfe ob alle Pointer auf etwas sinnvolles zeigen und deine Indizes alle in den Bereichsgrenzen liegen. Wenn du das Programm im Debugger ausführst (ich kenne CodeRunner nicht, aber da wird vermutlich ein Debugger integriert sein), dann zeigt er dir an, wo genau das Problem auftritt. Ansonsten zeig einen minimalen (also keine hundert Zeilen) aber vollständigen (sollte idealerweise kompilierbar sein) Beispielcode, der dein Problem illustriert.
-
Ja das ist bis jetzt mein kompletter Code.
Die beiden Variablen sollen unabhängig von b und h die Mitte des Spielfeld darstellen.int b = 15; int h = 15; int i = b/2; int j = h/2;
-
for(x1=0; x1<b; x1++) { // schreib das lieber mit spaces => Lesbarer spielfeld[x1][y1] = 0; // <- überleg mal welchen Wert y1 hier hat! Lass die Zeile einfach weg. for(y1=0;y1<h;y1++) { spielfeld[x1][y1] = 0; } }
Wenn du eh C99 nutzt, dann würde ich auch
for(int x1 = 0; x1 < b; x1++) { // ... }
bevorzugen. Dann passieren solche Fehler gar nicht erst!
-
haggis2810 schrieb:
#include <stdio.h> int main() { int b = 15; //x höhe int h = 15; //y breite int i; // wenn ich eine dieser beiden Variablen weglasse funktionerts int j; // wenn ich beide drin lasse kommt diese Fehlermeldung: // Run Command: line 1: 3069 Segmentation fault: 11 ./"$2" "${@:3}" int spielfeld[b][h]; int x1,y1; int x2,y2; for(x1=0;x1<b;x1++) { spielfeld[x1][y1] = 0; for(y1=0;y1<h;y1++) { spielfeld[x1][y1] = 0; } } for(x2=0;x2<b;x2++) { for (y2=0;y2<h;y2++) { printf("%d ",spielfeld[x2][y2]); } printf("\n"); y2=0; } }
Normales undefiniertes Verhalten: In Zeile 16 benutzt du den uninitialisierten Wert y1. Das tatsächlich passierende Verhalten wird n solchen Fallen gern mal durch ein paar zusätzliche oder weniger Variablen geändert, so dass man mal Abstürze bekommt, manchmal aber auch alles gut läuft. Falsch ist es aber auf jeden Fall.