2011-06-10 6 views
10

estoy usando strcmp en las formas siguientessegfault con strcmp

  1. Passing char [] nombres de matrices
  2. punteros Pasando a los literales de cadena pero, el segundo resultado de culpa seg. a pesar de que me han confirmado que los punteros punto para corregir los literales de cadena, estoy confundido en cuanto a por qué estoy recibiendo culpa seg .. Aquí está el código: -

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    
    int main(int argc, char const *args[]) 
    { 
        char firstName[strlen(*++args)]; 
        strcpy(firstName, *args); 
        char lastName[strlen(*++args)]; 
        strcpy(lastName, *args); 
        printf("%s\t%s\n", firstName, lastName); 
    
        printf("%d\n", strcmp(firstName, lastName));// this works 
    
        printf("%d\n", strcmp(*(--args),*(++args)));//this gives me a seg fault 
    
        return EXIT_SUCCESS; 
    } 
    

Estoy ahorrando como str. c y cuando lo compilo, primero consigo siguiente advertencia:

[[email protected] examples]$ gcc -Wall str.c -o str 

str.c: In function ‘main’: 
str.c:15: warning: operation on ‘args’ may be undefined 

fin de ejecutarlo, da un fallo seg como se muestra a continuación

[[email protected] examples]$ ./str Jimmy Neutron 


Jimmy Neutron 

-4 

Segmentation fault (core dumped) 
+3

La votación "demasiado localizada" en esto no tiene ningún sentido. Podría decirse que es un duplicado de http://stackoverflow.com/questions/7877258/why-does-this-ii-3-generate-a-warning-may-be-undefined ya que la verdadera pregunta es "¿qué significa esta advertencia? " pero demasiado localizado es simplemente perverso: inútil y sin sentido. – Flexo

Respuesta

14

No use -- y ++ cuando pasa la misma variable a la misma función dos veces como dos parámetros diferentes.

En lugar de printf("%d\n", strcmp(*(--args),*(++args)));

hacer

char *first = *(--args); 
char *second = *(++args); 
printf("%d\n", strcmp(first,second)); 

Aún en realidad no legibles (mejores índices de uso y comprobar la validez contra argc), pero al menos no cambian el valor y evalúan varias veces en el mismo punto de secuencia

+0

¿Por qué? C debe pasar las copias del puntero a la función. – Jimm

+4

@Jimm: C no garantiza ningún orden de evaluación. Por lo general, no es de izquierda a derecha. La modificación de una variable más de una vez en la misma declaración es un comportamiento indefinido. –

+0

@Jimm, sí, pero está cambiando los valores y evaluándolos al mismo tiempo, es un comportamiento indefinido. – littleadv

6

Además de lo que dice la publicación de littleadv, los almacenamientos intermedios tienen un carácter demasiado corto (no dejaba espacio para el terminador nulo). Por lo tanto, su strcpy causa un desbordamiento del búfer.

+0

Impar, aunque strcmp, es una función de cadena no restringida, lo anterior funciona bien con matrices de caracteres SIN carácter NULO. Solo cuando hago strcmp con punteros, obtengo seg fault. – Jimm

+1

@Jimm, por pura suerte. – littleadv

+1

@Jimm: Todavía es un comportamiento indefinido, ya que el desbordamiento del búfer aún sucedió (se escribirá un terminador nulo; simplemente lo hará _ fuera del límite del búfer).En este caso, eres afortunado de que el desbordamiento del búfer no haya matado a tu programa antes. –

Cuestiones relacionadas