2017-10-05 11 views
0

J'essayais d'utiliser strncpy puis strcpy et vice versa, mais j'ai continué à recevoir une erreur de segmentation pendant l'exécution. Je pensais que c'était à cause d'une erreur logique dans les fonctions, mais je changeais de place et seul le premier s'exécutait.Erreur de segmentation lors de l'appel strcpy

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char c = ' ', sentence[50], *pointer_to_string; 
    pointer_to_string = &sentence[0]; 
    int index = 0; 

    printf("Please enter a sentence:"); 
    while ((c = getchar()) != '\n') 
    { 
     sentence[index] = c; 
     index++; 
    } 
    sentence[index] = '\0'; 

    char *string_copy1, *string_copy2; 

    strncpy(string_copy1, pointer_to_string, 5); 
    printf("strncpy(string_copy1, pointer_to_string, 5):\n"); 
    printf("%s\n", string_copy1); 

    strcpy(string_copy2, pointer_to_string); 
    printf("strcpy(string_copy2, pointer_to_string):\n"); 
    printf("%s\n", string_copy2); 
} 
+0

Essayez de compiler avec 'valgrind -g' du drapeau et de l'utilisation tout en exécuter le programme:' valgrind/a.out' => vous obtiendrez plus d'informations – YaatSuka

+1

'char * string_copy1, * string_copy2,' ne fonctionne pas. initialiser l'une ou l'autre de ces variables. Donc, aucun d'entre eux ne pointe sur un emplacement de mémoire valide. Ensuite, vous utilisez str (n) cpy pour écraser le contenu d'un tableau de caractères - c'est-à-dire une "chaîne" - mais le pointeur que vous lui donnez ne pointe pas sur un tel tableau. Un comportement si indéfini s'ensuit. – rici

+1

Vous devez initialiser 'string_copy1' et' string_copy2; 'avant de les utiliser. Utilisation de malloc Découvrez comment ici http://fr.cppreference.com/w/c/memory/malloc –

Répondre

3

Voir documentation:

char *strcpy(char *dest, const char *src); 

Le premier argument est un pointeur vers la mémoire tampon de destination. Mais vos pointeurs ne sont pas initialisés:

char *string_copy1, *string_copy2; 

Par conséquent, les pointeurs contiennent des valeurs erronées. Et strcpy() écrit dans la mémoire qui n'appartient pas à votre programme. Il provoque segmentation fault.

Do

char string_copy1[50] = { 0 }; 
char string_copy2[50] = { 0 }; 

les remplir avec des zéros neccessaire pour éviter les problèmes avec strncpy():

S'il n'y a pas octet nul parmi les premiers n octets de src, la chaîne placée dans DEST ne pas être terminé par null.

+0

Comment les initialiser? Et la première fonction avec strncopy a fonctionné. – Gideon

+0

Merci, j'ai pointé les pointeurs vers de nouveaux tableaux de caractères, et les fonctions ont fonctionné. – Gideon

+1

N'utilisez pas strncpy(). Il ne fait pas ce que vous pourriez vous attendre, et il est en fait inutile, sauf pour la définition de champs de largeur fixe dans les bases de données, ce qui est l'utilisation pour laquelle il a été conçu. –