Bonne Façon D'Initialiser Char Non Signé*

Quelle est la bonne façon d'initialiser unsigned char* ? Je fais actuellement ceci:

unsigned char* tempBuffer;
tempBuffer = "";

ou devrais-je utiliser memset(tempBuffer, 0, sizeof(tempBuffer)); ?

14
demandé sur 54 69 6D 2011-02-02 17:59:45

7 réponses

la seconde méthode vous laissera avec un pointeur nul. Notez que vous ne déclarez pas d'espace pour un tampon ici, vous déclarez un pointeur à un tampon qui doit être créé ailleurs. Si vous l'initialisez à "" , le pointeur pointera vers un tampon statique avec exactement un octet-le terminateur null. Si vous voulez un buffer vous pouvez écrire des caractères plus tard, utilisez la suggestion de Tableau de Fred ou quelque chose comme malloc .

9
répondu Karl Bielefeldt 2011-02-02 15:10:52

pour "correctement" initialiser un pointeur ( unsigned char * comme dans votre exemple), vous devez faire juste un simple

unsigned char *tempBuffer = NULL;

Si vous voulez initialiser un tableau de unsigned char s, vous pouvez faire une des choses suivantes:

unsigned char *tempBuffer = new unsigned char[1024]();
// and do not forget to delete it later
delete[] tempBuffer;

ou

unsigned char tempBuffer[1024] = {};

je recommande aussi de jeter un oeil à std::vector<unsigned char> , que vous pouvez initialiser comme ceci:

std::vector<unsigned char> tempBuffer(1024, 0);
16
répondu Dmitry 2015-10-10 09:13:35

comme c'est un pointeur, vous voulez soit l'initialiser à NULL en premier comme ceci:

unsigned char* tempBuffer = NULL;
unsigned char* tempBuffer = 0;

ou attribuer une adresse d'une variable, comme ainsi:

unsigned char c = 'c';

unsigned char* tempBuffer = &c;

EDIT: Si vous souhaitez assigner une chaîne de caractères, ceci peut être fait comme suit:

unsigned char myString [] = "This is my string";
unsigned char* tmpBuffer = &myString[0];
5
répondu Kerri Brown 2011-02-02 15:28:03

si vous connaissez la taille du tampon au moment de la compilation:

unsigned char buffer[SIZE] = {0};

pour les tampons affectés dynamiquement (tampons affectés pendant la durée de fonctionnement ou sur le" tas 151990920"):

1.Préférez l'opérateur new :

unsigned char * buffer = 0;  // Pointer to a buffer, buffer not allocated.
buffer = new unsigned char [runtime_size];

2.De nombreuses solutions pour "initialiser" ou remplir avec une valeur simple:

std::fill(buffer, buffer + runtime_size, 0); // Prefer to use STL
memset(buffer, 0, runtime_size);
for (i = 0; i < runtime_size; ++i) *buffer++ = 0;  // Using a loop

3.Le côté c langue fournit l'allocation et l'initialisation avec un seul appel.

cependant , la fonction n'appelle pas les constructeurs de l'objet:

buffer = calloc(runtime_size, sizeof(unsigned char))

notez que cela permet aussi de régler tous les bits du tampon à zéro; vous n'avez pas le choix de la valeur initiale.

3
répondu Thomas Matthews 2015-10-10 10:57:45

cela dépend de ce que vous voulez accomplir (par exemple si vous voulez modifier la chaîne de caractères). Voir par exemple http://c-faq.com/charstring/index.html pour plus de détails.

notez que si vous déclarez un pointeur vers une chaîne littérale, il doit être const , i.e.:

const unsigned char *tempBuffer = "";
2
répondu Oliver Charlesworth 2011-02-02 15:02:04

si le plan est pour qu'il soit un tampon et que vous voulez le déplacer plus tard pour pointer vers quelque chose, alors initialisez-le à NULL jusqu'à ce qu'il pointe vraiment quelque part vers lequel vous voulez écrire, pas une chaîne vide.

unsigned char * tempBuffer = NULL;
std::vector< unsigned char > realBuffer( 1024 );
tempBuffer = &realBuffer[0]; // now it really points to writable memory
memcpy( tempBuffer, someStuff, someSizeThatFits );
1
répondu CashCow 2011-02-02 15:28:45

la réponse dépend de ce que vous avez indiqué pour utiliser la Charte non signée. Un char est rien sinon un petit entier, qui est de taille 8 bits sur 99% de toutes les implémentations.

C se trouve avoir un support de chaîne qui s'adapte bien avec char, mais qui ne limite pas l'utilisation de char aux chaînes.


la bonne façon d'initialiser un pointeur dépend de 1) sa portée et 2) son utilisation prévue.

si le pointeur est déclaré statique, et/ou déclaré à la portée du fichier, alors ISO C/C++ garantit qu'il est initialisé à NULL. Les puristes de style de programmation le définiraient encore à NULL pour garder leur style compatible avec les variables de portée locale, mais en théorie il est inutile de le faire.

pour savoir à quoi l'initialiser... réglez à NULL. Ne le positionnez pas au point"", parce que cela va allouer un byte de mannequin statique contenant une terminaison nulle, qui deviendra une minuscule petite fuite de mémoire statique dès que le pointeur est assigné à quelque chose d'autre.

on peut se demander pourquoi vous avez besoin de l'initialiser à n'importe quoi en premier lieu. Il suffit de le définir à quelque chose de valide avant de l'utiliser. Si vous vous souciez d'utiliser un pointeur avant de lui donner une valeur valide, Vous devriez obtenir un analyseur statique approprié pour trouver des bogues aussi simples. Même la plupart des compilateurs attraper l'insecte et vous donner un avertissement.

1
répondu Lundin 2011-02-02 16:13:57