2017-08-30 1 views
0

Je suis en train de créer un tampon de caractères comme indiqué:travaillant avec memcpy pour les tampons

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
struct gvk{ 
    char a ; 
    char b ; 
    char c ; 
}; 

int main(){ 
    char *buf; 
    struct gvk k = {'A','B','C'}; 

    memcpy(buf, &k , 3*sizeof(char)); 
    printf("values in buf is %s\n",buf); 
} 

Mais mon programme est sortie en disant « avec le statut non sorti zéro » Où ai-je fait de mal?

+0

'char buf [4];' ... 'sprintf (buf,"% c% c% c ", ka, kb, kc);' – BLUEPIXY

+2

Vous devez allouer de la mémoire pour le 'buf' et également terminer avec un '\ 0' si vous voulez utiliser'% s' pour imprimer. De plus, ce n'est pas une bonne idée de supposer que 'sizeof (gvk)' est de 3 octets. –

+0

En savoir plus sur [comportement indéfini] (https://en.wikipedia.org/wiki/Undefined_behavior) et de travailler dur pour l'éviter. Compilez avec toutes les informations d'avertissement et de débogage ('gcc -Wall -Wextra -g' avec [GCC] (http://gcc.gnu.org/) ...). Apprendre à utiliser le débogueur ('gdb') et [valgrind] (http://valgrind.org/) –

Répondre

2

Collègue supérieur vous dit d'allouer de la mémoire dynamique, mais depuis sa plus sujette aux erreurs, plus difficile de travailler avec (besoin de libre mémoire) puis avec tableaux automatiques + vous connaissez la taille dans la compilation, il n'y a aucune raison d'utiliser l'allocation dynamique. Je vous recommande d'utiliser un tableau automatique à la place. N'oubliez pas non plus un octet pour le caractère de terminaison nulle.

char buf[4]; 

Nous utilisons l'allocation dynamique juste s'il n'y a pas d'autre moyen. Même si vous ne connaissez pas la taille du tableau au moment de la compilation, puisque vous pouvez utiliser VLA.


compilateur également peut ajouter un rembourrage entre/derrière des éléments de struct. Rembourrage aligns structure des membres aux frontières d'adresses "naturelles".

Dans votre cas, il probablement ressembler à ce

struct gvk{ 
    char a ; // 1B 
    char b ; // 1B 
    char c ; // 1B 
      // 1B padding 
}; 

Ce qui signifie que dans ce cas, il devrait bien fonctionner, de toute façon, vous devriez éviter d'utiliser memcpy(buf, &k , 3*sizeof(char)); sur des structures comme celle-ci, parce que vous pouvez copier le remplissage au lieu de véritable élément de structure.


De plus il n'y a pas besoin de taper explicitement sizeof(char) qui, par la norme, a une taille 1 (B).

1

Vous devez allouer de la mémoire avant d'utiliser buf sinon il s'agit d'un comportement non défini.

Vous devez le déclarer comme celui-ci (Dynamiquement):

char *buf = malloc(sizeof(char)*4); 
+0

Aussi le terminateur de chaîne s'il veut utiliser'% s' pour l'impression –

+1

'sizeof (char)' est * toujours * 1 par définition –