/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
underlig segfault, men ikke i ddd
Fra : gunter


Dato : 12-12-03 15:13

Hvorfor segfault flg. program??
Hvis jeg kører det gennem ddd og indsætter breakpoint lige inden return
i main() og derefter trykker continue er der ingen segfault. Hvis intet
breakpoint eksisterer segfaulter det også i ddd.

#include <stdio.h>
int is_ws(char test);

void main() {
char *blok=" bla";

int i;
int j=0;
printf("START\n");
for (i=0; blok[i]!='\0'; i++) {
if (is_ws(blok[i])==1){
}
else {
blok[j++]=blok[i];
}
// lastseen=blok[i];
}
blok[j]='\0';
printf("%s\n", blok);
return;
}

int is_ws(char test) {
if (test==' '||test=='\n'||test=='\t'||test=='\r')
return 1;
return 0;
}


 
 
gunter (12-12-2003)
Kommentar
Fra : gunter


Dato : 12-12-03 15:17

Jeg kan lige tilføje at det er i nedenstående linje der er segfault
blok[j++]=blok[i];


Michael Sig Birkmose (12-12-2003)
Kommentar
Fra : Michael Sig Birkmose


Dato : 12-12-03 17:04



Bertel Brander (13-12-2003)
Kommentar
Fra : Bertel Brander


Dato : 13-12-03 00:16

Michael Sig Birkmose wrote:
>> char *blok=" bla";
>
> (snip)
>
>> blok[j++]=blok[i];
>
>
> her proever du vist at skrive til noget der er allokeret som en const char
> *?
>

Skal man være pedantisk så er " bla" en string literal, ikke en
const char *

I C99 står der om string literal's (6.4.5):

"If the program attempts to modify such an array,
the behavior is undefined."

/b


Byrial Jensen (12-12-2003)
Kommentar
Fra : Byrial Jensen


Dato : 12-12-03 19:12

gunter wrote:
> Hvorfor segfault flg. program??
>
> #include <stdio.h>
> int is_ws(char test);
>
> void main() {

Det kunne være på grund af forkert definition af main() som skal
returnere int. Det giver udefineret adfærd.

> char *blok=" bla";
>
> int i;
> int j=0;
> printf("START\n");
> for (i=0; blok[i]!='\0'; i++) {
> if (is_ws(blok[i])==1){
> }
> else {
> blok[j++]=blok[i];

Det kunne også (og nok mere sandsynligt) være på grund af forsøg på at
ændre en streng konstant. Det giver også udefineret adfærd.

> }
> // lastseen=blok[i];
> }
> blok[j]='\0';
> printf("%s\n", blok);
> return;
> }


Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408182
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste