2010-07-03 12 views
6
#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    //char s[6] = {'h','e','l','l','o','\0'}; 
    char *s = "hello";  
    int i=0,m; 
    char temp; 

    int n = strlen(s); 
    //s[n] = '\0'; 
    while (i<(n/2)) 
    { 
     temp = *(s+i);  //uses the null character as the temporary storage. 
     *(s+i) = *(s+n-i-1); 
     *(s+n-i-1) = temp; 
     i++; 
    } 
    printf("rev string = %s\n",s); 
    system("PAUSE"); 
    return 0; 
} 

Nella compilazione l'errore è un errore di segmentazione (violazione di accesso). Si prega di dire che cosa è la differenza tra le due definizioni:Errore di segmentazione che inverte una stringa letterale

char s[6] = {'h','e','l','l','o','\0'}; 
char *s = "hello"; 
+0

forse un titolo diverso? sebbene l'esempio sia il codice per invertire una stringa, la domanda effettiva riguarda la modifica di array e stringhe letterali – akf

+0

Hai qualche motivo per cui non stai usando 'strrev()'? Inoltre, questo si interromperà con caratteri multi-byte. – Piskvor

risposta

13

Il codice tenta di modificare una stringa letterale, che non è consentito in C o C++ se si cambia:

char *s = "hello"; 

a:

char s[] = "hello"; 

quindi si sta modificando il contenuto dell'array, in cui è stato copiato il letterale (equivalente all'inizializzazione dell'array con singoli caratteri), che è OK.

4

Se si esegue char s[6] = {'h','e','l','l','o','\0'};, inserire 6 char in una matrice nello stack. Quando fai char *s = "hello"; c'è solo un puntatore sullo stack e la memoria a cui punta potrebbe essere di sola lettura. Scrivere su quella memoria causa un comportamento indefinito.

0

Con alcune versioni di gcc è possibile consentire la modifica di stringhe statiche con stringhe -fwritable. Non che ci sia davvero una buona scusa per farlo.

0

Si può provare questo:

void strrev(char *in, char *out, int len){ 
    int i; 

    for(i = 0; i < len; i++){ 
     out[len - i - 1] = in[i]; 
    } 
} 

Si noti che non si tratta con il terminatore di stringa.