2015-12-13 3 views
-3

J'ai fait cet exemple de travail minimal d'un plus gros morceau de code que j'ai. Le problème est, que sizeof imprime pour le premier appel 16, qui est la taille correcte, et pour le 2ème appel seulement 8. La chose wierd est, il imprime toujours 8, indépendamment de la taille de la structure, si il n'y a qu'une valeur ou 10 valeurs dedans.Incorrect bytesize après l'appel de méthode

struct test_struct 
{ 
    int32_t val1; 
    int32_t val2; 
    int32_t val3; 
    int32_t val4; 
}; 

unsigned char * StructToChar(test_struct structy) 
{ 
    unsigned char returnval[sizeof(structy)]; 
    memcpy(returnval, &structy, sizeof(structy)); 
    return returnval; 
} 

int main() 
{ 
    test_struct sendstruct = {}; 
    unsigned char *test_array = StructToChar(sendstruct); 

    unsigned char returnval[sizeof(sendstruct)]; 
    memcpy(returnval, &sendstruct, sizeof(sendstruct)); 

    printf("%d\n", sizeof(returnval)); 
    printf("%d\n", sizeof(test_array)); 
    return 0; 
} 
+3

Vous ne devez pas renvoyer de pointeur de variable locale. – Jarod42

+0

On dirait que C. C n'est pas C++ n'est pas C. Choisissez ** un ** langue. Et C ne supporte pas _methods_, mais seulement _functions_. – Olaf

Répondre

5

sizeof(test_array) est sizeof(unsigned char *) donc la taille d'un pointeur .

+0

@dasblinkenlight: Je suis d'accord que le code d'OP a UB (je l'ai pointé dans le commentaire), mais même s'il est corrigé, 'sizeof (unsigned char *)' ne sera pas attendu par OP. – Jarod42

+2

Il est un peu négligent de ne pas mentionner l'UB dans votre réponse si –