Segmentation fault - Warum?
-
Hallo,
ich habe nach einer Speicheralocierung alle Werte im Speicher auf Null setzen wollen. Dabei habe ich zwei Varianten angewandt, da bei einer Variante die Fehlermeldung "Segmentation fault" bei der Programmausführung auftrat. Ich habe bisher noch keine Erklärung gefunden, warum die eine Variante funktioniert die andere nicht, obwohl das gleiche beschrieben wird. Habt Ihr eine Schlüssige Erklärung dafür? Hier Variante eins, bei der es funktioniert:
m = 12; n = 12; Null = 0; RC = (double *) malloc (m*n*sizeof(double)); for (k = 0; k < m * n; ++k) { RC[k] = Null; }
und hier die Variante 2, bei der es nicht funktioniert und die Fehlermeldung "Segmentation fault" ausgelöst wird:
m = 12; n = 12; RC = (double *) malloc (m*n*sizeof(double)); for (k = 0; k < m * n; ++k) { RC[k] = 0; }
-
poste mal das ganze programm.
-
Hallo Icke,
habe es herausgefunden. Dummer Fehler meinerseits, da ich beim Variabledefinieren die Adressen nicht mit =NULL auf Null gesetzt habe. Je nachdem welchen Compiler ich verwendete (unter Windows oder Linux) hat der eine Standartmässig alles erstmal auf Null gesetzt, der andere eben nicht und somit diesen Fehler hervorgerufen. So sieht jetzt meine Lösung aus, und sie funktioniert unter den getesteten Plattformen.
# include <stdio.h> # include <stdlib.h> # include <math.h> #define FORMAT_STRING "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n" #ifdef _WINDOWS_ #define FILE_NAME "O:\\Neubert\\Programmierung\\Var_Def.txt" #define M_PI 3.1415927 #else #define FILE_NAME "/mnt/alle/Neubert/Programmierung/Var_Def.txt" #endif typedef struct stab STAB_t; struct stab { double XY_Angle, XZ_Angle; //Lagewinkel des Stabes double E_Modul, G_Modul; //MaterialkenngröÃen double AE, AYE, AZE, IYE, IZE, IT, LE; //GeometriekenngröÃen }; int main() { FILE *Var_Def=NULL; STAB_t *STAEBE=NULL; double *RC=NULL; double Winkel_X, Winkel_Y; double XR, YR, ZR, XP, YP, LX, LY, XZ, YZ, ZZ, LZ; int i, j, k, l, m, n, XL, YL, ZL, ZP; Var_Def = fopen(FILE_NAME, "r"); if (Var_Def!=NULL) { fscanf(Var_Def, "%d\n", &i); } else { i=0; } printf("%d %p\n",i, Var_Def); getchar(); STAEBE=(STAB_t *)malloc(i*sizeof(STAB_t)); for (j = 0; j < i; ++j) { printf("%d %p\n",j,Var_Def); fscanf(Var_Def, FORMAT_STRING, &(STAEBE[j].XY_Angle), &(STAEBE[j].XZ_Angle), &(STAEBE[j].E_Modul), &(STAEBE[j].G_Modul), &(STAEBE[j].AE), &(STAEBE[j].AYE), &(STAEBE[j].AZE), &(STAEBE[j].IYE), &(STAEBE[j].IZE), &(STAEBE[j].IT), &(STAEBE[j].LE)); printf("%lf %lf\n\n\n", STAEBE[j].XY_Angle, STAEBE[j].XZ_Angle); Winkel_X = STAEBE[j].XY_Angle * M_PI/180;//in C unter math.h ist //M_PI definiert Winkel_Y = STAEBE[j].XZ_Angle * M_PI/180; XR = cos(STAEBE[j].XZ_Angle)*cos(STAEBE[j].XY_Angle); XL = 0; YR = cos(STAEBE[j].XZ_Angle)*sin(STAEBE[j].XY_Angle); YL = 0; ZR = sin(STAEBE[j].XZ_Angle); ZL = 0; XP = -sin(STAEBE[j].XY_Angle); YP = cos(STAEBE[j].XY_Angle); ZP = 0; LX = sqrt((XR-XL)*(XR-XL)+(YR-YL)*(YR-YL)+(ZR-ZL)*(ZR-ZL)); LY = sqrt(XP*XP+YP*YP+ZP*ZP); XZ = (YR-YL)*ZP-(ZR-ZL)*YP; YZ = (ZR-ZL)*XP-(XR-XL)*ZP; ZZ = (XR-XL)*YP-(YR-YL)*XP; LZ = sqrt(XZ*XZ+YZ*YZ+ZZ*ZZ); printf("%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf\n\n", Winkel_X, Winkel_Y, XR, YR, ZR, XP, YP, LX, LY, XZ, YZ, ZZ, LZ); getchar(); m = 12; n = 12; RC = (double *) malloc (m*n*sizeof(double)); for (k = 0; k < m * n; ++k) { RC[k] = 0.0; } RC[0] = (XR-XL)/LX; RC[39] = RC[0]; RC[78] = RC[0]; RC[117] = RC[0]; RC[1] = (YR-YL)/LX; RC[40] = RC[1]; RC[79] = RC[1]; RC[118] = RC[1]; RC[2] = (ZR-ZL)/LX; RC[41] = RC[2]; RC[80] = RC[2]; RC[119] = RC[2]; RC[12] = XP/LY; RC[51] = RC[12]; RC[90] = RC[12]; RC[129] = RC[12]; RC[13] = YP/LY; RC[52] = RC[13]; RC[91] = RC[13]; RC[130] = RC[13]; RC[14] = ZP/LY; RC[53] = RC[14]; RC[92] = RC[14]; RC[131] = RC[14]; RC[24] = XZ/LZ; RC[63] = RC[24]; RC[102] = RC[24]; RC[141] = RC[24]; RC[25] = YZ/LZ; RC[64] = RC[25]; RC[103] = RC[25]; RC[142] = RC[25]; RC[26] = ZZ/LZ; RC[65] = RC[26]; RC[104] = RC[26]; RC[143] = RC[26]; for ( k = 0; k < m; ++k) { printf("\n"); for ( l = 0; l < n; ++l) { printf("%lf ", RC[k*n+l]); } } getchar(); free(RC); } if (Var_Def!=NULL) { fclose(Var_Def); } if (STAEBE!=NULL) { free(STAEBE); } getchar(); return 0; }
-
Du meinst das passt jetzt, da Du RC am Anfang auf NULL zeigen lässt.
Das glaub ich nicht dass es deswegen nicht läuft......welcher Compiler meckert denn da.
Nen Segfault gibts wenn Du auf was zugreifst was Dir nicht gehört.
Du schaffts doch durch die Deklaration von RC extra Speicherplatz für einen Pointer auf ein double. Mit malloc weist du dann diesem Speicherplatz, welcher für den Pointer auf ein double reserviert wurde, die Anfangsadresse des Blocks zu, den Du Dir gerade dynamisch durch malloc geholt hast.
Ob jetzt in RC vor malloc NULL drinsteht oder sonst noch was, müsste doch ziemlich egal sein.
-
Ja, genau das habe ich gemacht gehabt. Ich habe auf etwas zugegriffen wass mir nicht gehörte, da ich ursprünglich diese Zeile:
STAEBE=(STAB_t *)malloc(i*sizeof(STAB_t));
noch nicht in mein Programm inzegriert hatte (hatte ich erst vergessen noch zu erwähnen). Nur durch Zufall hat das Programm auf einen Speicheplatz gegriffen, der gerade richtige Werte enthielt mit denen er arbeiten konnte. In einem anderen Compiler eben nicht. Um das herauszufinden musste ich eben =NULL setzen, um sicherzugehen, dass keine regulären Werte von irgendwo und irgendwann im Speicher standen. Nur so bin ich überhaupt darauf gestoßen, das eine Speicherzuweisung fehlte.
-
Ork schrieb:
Um das herauszufinden musste ich eben =NULL setzen, um sicherzugehen, dass keine regulären Werte von irgendwo und irgendwann im Speicher standen. Nur so bin ich überhaupt darauf gestoßen, das eine Speicherzuweisung fehlte.
Nun gut, das mag sein, dass Du nur so drauf aufmerksam geworden bist. Das heisst aber nicht, dass du das =NULL benötigst. Lass das mal weg! Der Code sollte auch ohne funktionieren.
-
Danke icke,
habe es weggelassen und funktioniert genauso.