0
votes

Pourquoi initialiser un tableau avec 0 efface tout le tampon?

Je initialise mon tableau, avec 0 code>, et j'ai le tampon propre, qu'advient-il des bits? Par exemple, lorsque je initialise avec 'A' code>, pas le même, s'il était avec Memset code> Le tampon entier serait rempli avec 'A' code >?

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

int main(void) {

    char buffer[256] = {0}, array[256] = {'a'};
    char array1[256];
    memset(array1, 'a', sizeof(array1));

    printf("%c\n%c\n%c\n", buffer[1], array[1], array1[1]);

    return 0;

}


3 commentaires

Il peut sembler que la mémoire tampon était entièrement remplie par l'initaliser, mais c'est tout simplement parce que tout dépassant l'entrée que vous donnez est définie sur 0 pour les caractères. Si vous essayez tampon [256] = {65} au lieu de cela, vous remarquerez que seule la position 0 est 65 ('a')


Je sais que c'était juste un exemple, car quand il initialise 0, le reste de la matrice est rempli de 0 tuberculose, je ne me souviens pas pourquoi cela se produit


Dupliqué possible de Comment initialiser tous les membres d'un tableau à la même valeur?


3 Réponses :


2
votes

Si l'initialiseur ne fournit pas suffisamment d'éléments pour initialiser la variable complète, le repos est initialisé comme si la variable était déclarée au niveau mondial, c'est-à-dire:

  • nombres entiers à 0
  • flotte à 0.
  • Pointeurs à NULL .

    Dans votre exemple particulier, les éléments restants du char -Array tableau suivront la règle ci-dessus pour les entiers.


0 commentaires

2
votes

L'initialisation dans le cas du tableau [256] = {'A'}; se produit conformément à cette règle:

6.7.9 Initialisation

...
21 s'il y a moins d'initialistes dans une attelle-bloquée LISTE que des éléments ou des membres d'un agrégat ou moins de caractères dans un littéral à chaîne utilisée pour initialiser un tableau de taille connue que des éléments de la matrice, Le reste de l'agrégat doit être initialisé implicitement identique à celui des objets qui ont une durée de stockage statique .

Donc, seul le premier élément du tableau aura la valeur 'a' .

mais dans le cas de MEMSET fonction,

VOID * MEMSET (NOID * S, INT C, TAILLE_T N);

La fonction copie la valeur de C (converti en un non signé char ) dans chacun des premiers caractères N de l'objet pointé vers par s .

donc dans ce cas, tous les éléments de array1 auront la valeur 'a' . .


1 commentaires

La fonction MEMSET n'était qu'un exemple, mais merci pour votre réponse.



0
votes

Lorsque vous entrez la fonction, dans ce cas Main () La pile est augmentée de la quantité requise par le cadre de pile, dans le cadre de la pile, il y a de l'espace pour tous les autos (variables déclarées dans la fonction) ainsi que d'autres informations non pertinentes ici. Donc, dans ce cas lorsque vous écrivez xxx

comme le programme passe dans la fonction, la pile sera augmentée de suffisamment pour faire de la place à 256 caractères dans le tableau, la valeur des caractères de la matrice est indéfini, il est possible que cette zone en mémoire soit précédemment écrite par une autre fonction ou un autre programme qui n'en a plus besoin, nous ne savons donc pas quelle est la valeur du reste de la matrice.

Quand vous écrivez xxx

équivalent à: xxx

Dans ce cas, nous n'avons pas défini ce qui est dans le reste de le tableau

lorsque vous faites xxx

La CPU devra passer par l'ensemble de la matrice et initialiser chaque caractère dans la matrice à "A", créant une valeur connue pour tout dans la matrice au prix d'utilisation d'un peu plus de processeur.


0 commentaires