En C, comment puis-je créer un "statique" tableau de taille constante avec mise à zéro des valeurs, mais sans calloc?
J'ai actuellement un peu de code dans une fonction qui ressemble à ceci:
static const int kFrameCountSample = 250;
static float * samples = (float *)calloc(kFrameCountSample, sizeof(float));
J'aime que les échantillons tableau est mis à zéro exactement une fois avec calloc()
.
Je peux aussi écrire le code pour samples
est alloué sur la pile.
static const int kFrameCountSample = 250;
static float samples[kFrameCountSample];
mais maintenant samples
n'est pas initialisé à zéro des valeurs. Comment pourrais-je également initialiser le temps est alloué?
samples
n'est pas alloué sur la pile.Il est statique. Ce n'est pas sur la pile. Et si vous êtes compilateur C est à distance moderne, vous pouvez simplement
static float samples[kFrameCountSample] = {0};
Le tableau statique est alloué et initialisé au démarrage du programme, mais n'est pas réinitialisé après que, à moins que vous ne explicitement. Il ne sera pas réinitialisé à chaque fois que la fonction de contenant, il est appelé (si c'est dans une fonction).
Si elle est déclarée à l'
static
c'est certainement mise à zéro pour commencer - objets à durée de stockage statique, sans obligation d'initialiseur sont initialisées à zéro du type approprié.Mon commentaire s'applique à C.
OriginalL'auteur Michael Bishop | 2013-08-16
Vous devez vous connecter pour publier un commentaire.
Pour l'exhaustivité (note: ceci est C99 PAS du C++):
Il est important de noter que si vous définir et initialiser un tableau statique de longueur
k
à moins dek - 1
valeurs, puis le reste sera rempli par des zéros. Donc:... est identique à:
... et zéro de remplissage
samples
. En outre, si vous effectuez les opérations suivantes:... il est égal à zéro-remplir le reste des éléments qui ne sont pas attribués dans l'initialisation de
samples
.Remarque:
"Si un objet qui a automatique de la durée de stockage n'est pas initialisé explicitement, sa valeur est indéterminée. Si un objet statique de la durée de stockage n'est pas initialisé explicitement, alors:
static
- sont toujours initialisés, soit explicitement avec un initialiseur ou zéro si aucune donnée n'est.il est balisé en vertu de la C pas du C++.
Je sais, mon commentaire s'applique à C. Cela est défini dans le §6.7.8 du standard C99.
ne se rendent même pas compte. Fixe ma réponse.
Vous avez également besoin de fixer le premier bit sur
static float samples...
avoir des ordures valeurs.OriginalL'auteur Jacob Pollack
Le code que vous avez donné:
n'est pas valide C. les Objets statiques durée de stockage ne peut pas avoir de variable-type modifié. D'autre part, ce serait valide:
C'est valide soit à la portée du fichier ou à portée de la fonction. Dans les deux cas, le tableau
samples
a durée de stockage statique, ce qui signifie qu'il existe pour l'ensemble de la vie du programme et est initialisé qu'une seule fois, au démarrage du programme. Le seulement différence, c'est que si c'est dans une fonction, la portée du nomsamples
est limitée au bloc dans lequel elle est déclarée. Dans les deux cas, est-il susceptible d'être allouée sur la pile.Le tableau
samples
ici est initialisé à zéro - objets statiques durée de stockage ne sont jamais initialisée. Si vous n'avez pas de disposition expresse de l'initialiseur, ils sont initialisés à zéro du type approprié.Si vous ne voulez un tableau stocké sur la pile qui est créé lorsque la fonction contenant la déclaration est saisi et détruit lorsque cette fonction est sorti, de ce que C appels automatique de la durée de stockage - ensuite, vous devez le déclarer à l'intérieur d'une fonction, d'omettre l'
static
mot-clé et ajouter une explicite de l'initialiseur:(Dans ce cas
kFrameCountSample
n'a pas besoin d'être une macro, il peut être unstatic const int
si vous le souhaitez).Un seul
{ 0 }
est très bien quelle que soit la taille du tableau, car les objets en C ne sont jamais partiellement initialisée si vous initialisez un sous-objet d'un tableau ou d'une structure, le reste des sous-objets sont initialisés à zéro du type approprié, tout comme avec les objets de la statique de la durée de stockage.Si vous ajoutez le
-pedantic
option vous verrez un message d'avertissement "longueur variable tableau plié à la constante de tableau comme une extension"vous aurez aussi besoin d'être de la compilation du source C de voir que d'avertissement, pas de C++ c'est un domaine où le C et le C++ sont différentes).
OriginalL'auteur caf
Un tableau qui n'a que quelques positions initialisé à une valeur aura des zéros dans les autres positions.
Devrait faire l'affaire.
OriginalL'auteur TheExplosiveSheep
Vous pouvez faire memset pour éviter tout risque de quelque chose de pas être initlaized à zéro.
http://man7.org/linux/man-pages/man3/memset.3.html
Ce qu'il fait est un à chaque octet dans les échantillons. Sens que ça va être initialisé rapidement à 0.
N'ai pas vu que vous étiez en cours de création dans une fonction appelée, juste la pensée de la création en général. Mon mauvais.
OriginalL'auteur Ion