Avatar billede henrikbremer Nybegynder
29. oktober 2001 - 17:41 Der er 8 kommentarer og
1 løsning

Hvorfor opstår der Segmentation fault?!?

Når jeg skriver mine C programmer, opstår der nogen gange segmentation faults, når jeg kører det.

Hvis jeg så tager den kode ud, som giver fejlen og kører det i er seperat program, opstår der ingen fejl.

Hvorfor og hvad kan jeg gøre for at undgå det.

Jeg skal bare lave et par simple scanf(\"%d\", integer);

Avatar billede mickni33 Nybegynder
29. oktober 2001 - 18:08 #1
Du kører med linux ikke ?
Jeg har været ude for det samme når det har været noget med en løkke der skal køre til NULL Det har den ikke kunnet klare , ved ikke hvorfor
Avatar billede henrikbremer Nybegynder
29. oktober 2001 - 19:00 #2
Jo det gør jeg. Fejlen opstår nogen gange når jeg laver strenge som pointere
char *streng;

Det løser sig dog, hvis jeg laver dem som char stregn[32];

Probelemet opstår dog ofte andre steder.

Nogen forslag til, hvordan man fixer det/ undgår det?
Avatar billede mickni33 Nybegynder
29. oktober 2001 - 19:08 #3
er der ikke noget med at man selv skal ligge en null terminering ind (\\0)
ved char* streng er der måske ikke nogle NULL terminering så du kan ikke køre en while(x != NULL) for den kommer aldrig.
ved et char streng[] array er der automatiske et null terminering
måske!! er det noget med det ved ikke helt.


prøv med en
while(true)

eller
while(x != NULL)

eller en løsning som jeg nogle gange er nødt til at bruge:

lav en tæller som du kan bruge istedet for x!=NULL eller true

vent!!!
sufer lige, vender tilbage.
Avatar billede mickni33 Nybegynder
29. oktober 2001 - 19:10 #4
fandt sku lige dette
--------------------------------------------
segmentation fault n.

[Unix] 1. [techspeak] An error in which a running program attempts to access memory not allocated to it and core dumps with a segmentation violation error. This is often caused by improper usage of pointers in the source code, dereferencing a null pointer, or (in C) inadvertently using a non-pointer variable as a pointer. The classic example is:

  int i;
  scanf (\"%d\", i);  /* should have used &i */




2. To lose a train of thought or a line of reasoning. Also uttered as an exclamation at the point of befuddlement.

Avatar billede mickni33 Nybegynder
29. oktober 2001 - 19:11 #5
det må da ligne det du skal bruge
Avatar billede jpk Nybegynder
29. oktober 2001 - 20:17 #6
=> mickni33
Nej, der er IKKE automatisk NULL terminering på et char array!
Avatar billede soepro Nybegynder
30. oktober 2001 - 10:31 #7
jpk >> Jo, hvis array\'et er længere end din init-streng, så bliver der indsat karakter \'\\x0\'. Du kan kun tvinge den til at lade være, ved at give init-værdien til hvert enkelt element:

char a[3] = { {\'a\'}, {\'b\'}, {\'c\'} };

Under TC+ 3.0 giver dette her faktisk memory overwrite problemer:

char a[3] = \"abc\";

Hvis du skriver:

char a[4] = \"abc\";

så er a[3] = \'\\x0\';
Avatar billede jpk Nybegynder
30. oktober 2001 - 10:56 #8
jo jo, hvis arrayet er LÆNGERE end antallet af de chars der sættes ind...
Hvis du angiver:
char a[10] = \"abc\";
er de uinitialiserede (af bruger, ikke compiler) chars jo ALLE \'\\xo\'

char a[3] = { {\'a\'}, {\'b\'}, {\'c\'} };
giver ikke i sig selv problemer, kun hvis arrayet anvendes forkert...
(i en sammenhæng hvor der forventes en null-termineret streng)
Avatar billede ttn.bonk Nybegynder
30. oktober 2001 - 20:06 #9
mickni33 har ret. En segmentation fejl optræder når et program skriver i noget hukommelse som ikke er ejet af programmet (en vild pointer).
F.eks. sker det ofte hvis man laver
a) int x;
  scanf(\"%d\",x);
og ikke
  int x;
  scanf(\"%d\",&x);
eller
b)
  char *p;
  strcpy(p,\"Hello world\");
hvor hukommelse som p peger på ikke er reserveret af programmet (med en malloc eller new operator).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester