2012-09-03 9 views
1

Voici mon code:ne peut pas affecter char carboniser pointeur


    printf("%s\n", "test1"); 
    char c = '2'; 
    char * lines[2]; 
    char * tmp1 = lines[0]; 

    *tmp1 = c; 
    printf("%s\n", "test2"); 

Je ne vois pas la deuxième printf dans la console.

Question: Quelqu'un peut-il m'expliquer ce qui ne va pas avec mon code?

NOTE: Je suis en train d'apprendre C :)

Répondre

4

Cette ligne:

char * lines[2]; 

déclare un tableau de deux char pointeurs. Cependant, vous n'avez pas initialiser les pointeurs vers n'importe quoi. Donc plus tard, quand vous faites *tmp1 = (char)c;, vous affectez le caractère c à quelque part en mémoire, peut-être même l'adresse zéro (c'est-à-dire NULL) ce qui est une mauvaise chose.

La solution consiste à créer le tableau comme un tableau de tableaux, comme

char lines[2][30]; 

Cela déclare lignes d'avoir deux rangées de 30 caractères chacune, et puisque les chaînes a besoin d'un caractère de terminaison spécial vous pouvez chaîne de jusqu'à 29 caractères en eux.

La deuxième solution est d'allouer dynamiquement la mémoire pour les chaînes:

char *lines[2]; 
lines[0] = malloc(30); 
lines[1] = malloc(30); 

Essentiellement, cela fait la même chose que ci-dessus tableau-de-tableaux déclaration, mais alloue la mémoire sur le tas.

Bien sûr, peut-être vous vouliez une seule chaîne d'un seul caractère (plus la terminaison), alors vous étiez presque droite, il suffit de supprimer l'astérisque:

char line[2]; /* Array of two characters, or a string of length one */ 
3

lines est non initialisée, et tmp1 initialisation est erroné.

Il devrait être:

char lines[2]; 
char * tmp1 = lines; 

Vous pouvez dire:

char * tmp1 = &lines[0]; 

Ou bien pour un tableau de chaînes:

char lines[2][30]; 
char * tmp1 = lines[0]; 
+0

-1 Le problème est que 'lines' n'est pas initialisé. –

+0

lignes [0] n'est pas le type de caractère – phoxis

+0

Merci pour le correctif, j'ai défait mon downvote. –

3

Le tableau lines dans uninitialized. Ainsi, lines[0] est un pointeur non-initié. Le déréférencement dans *tmp1 est pure comportement indéfini.

est ici une alternative, qui peuvent ou peuvent ne pas correspondre à ce que vous voulez:

char lines[2]; 
char * tmp1 = lines; // or "&lines[0]" 

*tmp = c; 

Ou, plus facilement:

char lines[2] = { c, 0 }; 
1

La ligne

char * lines[2]; 

crée un tableau de deux pointeurs char. Mais cela n'alloue pas de mémoire, c'est juste un "handle" ou un "nom" pour le pointeur en mémoire. Le pointeur ne pointe pas vers quelque chose d'utile.

Vous aurez soit à allouer de la mémoire à l'aide malloc():

char * lines = malloc(2); 

ou dire au compilateur d'allouer de la mémoire pour vous:

char lines[2]; 

Note: Ne pas oublier de mettre fin à la chaîne avec un 0 octet avant de l'utiliser.

1

char *lines[2];: Un tableau à deux éléments de charbon pointeurs.

char *tmp;: pointeur sur un caractère.

char *tmp = lines[0]: La valeur à l'intérieur de l'élément de tableau du tableau 0lines est transféré dans tmp. Parce que c'est un tableau automatique, il aura donc la poubelle comme valeur pour lines[0].

*temp: Déréférencer la valeur de la poubelle. Comportement indéfini

1
char * tmp1 = lines[0]; 

ici on déclare un pointeur char et initialiser la valeur de pointeur à la ligne [0], l'élément de poing stocké dans le réseau de ligne qui est également initialisé.

maintenant le tmp pointe vers un endroit inconnu et inaccessible. Lorsque vous

*tmp1 = (char)c; 

vous utilisez une adresse de mémoire non valide qui provoque une erreur de segmentation