2 votes

Valeurs par défaut dans struct c [duplicates]

Qu'est-ce que le code ci-dessous imprime lors de l'exécution de la fonction print_test() ?

struct test {
  int a, b, c;
};

void print_test(void) {
  struct test t = {1};
  printf("%d/%d/%d", t.a, t.b, t.c);
}

Solution 1 \0\0

Pourquoi b et c sont-ils initialisés à zéro alors que je ne l'ai pas fait ? Existe-t-il des valeurs par défaut pour la structure ? Cependant, la structure n'est pas globale et le membre n'est pas statique. Pourquoi sont-ils automatiquement initialisés à zéro ? Et si le type de données n'était pas int un autre type de données à quelle valeur sera-t-il initialisé ?

3voto

tenfour Points 16759

Si vous ne spécifiez pas suffisamment d'initialisateurs pour tous les membres d'une structure, vous serez confronté aux problèmes suivants Initialisation du zéro qui initialisera les autres membres à 0 . Je pense que selon les normes actuelles, cela semble un peu étrange, notamment parce que la syntaxe d'initialisation du C++ a beaucoup évolué et mûri au fil des ans. Mais ce comportement est conservé pour des raisons de rétrocompatibilité.

1voto

Muhammad Points 136

Je pense que nous devons savoir deux points à ce stade :

  1. Il n'y a pas de différence entre les variables ordinaires et les structures, si elles sont à portée locale, c'est-à-dire automatic storage duration . Ils contiendront des valeurs inutiles. L'utilisation de ces valeurs pourrait entraîner un comportement non défini.

La seule chose qui différencie les structs est que si vous initialisez au moins un des membres, le reste des membres sera mis à zéro, c'est-à-dire initialisé comme s'il n'avait pas été initialisé. static storage duration . Mais ce n'est pas le cas lorsqu'aucun des membres n'est initialisé.

  1. Cela dépend de votre déclaration. Si votre déclaration se trouve en dehors de toute fonction ou avec la balise static keyword (plus précisément, a static storage duration ), la valeur initiale de x est a null pointer (qui peut être écrit soit 0, soit NULL).

S'il est à l'intérieur d'une fonction, c'est-à-dire qu'il a automatic storage duration sa valeur initiale est aléatoire (garbage).

Considérons le code suivant :

#include<stdio.h>
#include<unistd.h>

struct point {
    int x, y;
    char a;
    double d;
};    
typedef struct point Point;

void main(){ 
    Point p1;
    printf("\nP1.x: %d\n", p1.x);
    printf("\nP1.y: %d\n", p1.y);
    printf("\nP1.a: %d\n", p1.a);
    printf("\nP1.d: %lf\n", p1.d);

    Point p2 = {1};
    printf("\nP2.x: %d\n", p2.x);
    printf("\nP2.y: %d\n", p2.y);
    printf("\nP2.a: %d\n", p2.a);
    printf("\nP2.d: %lf\n", p2.d);
}

La sortie est :

P1.x: 0

P1.y: 66900

P1.a: 140

P1.d: 0.000000

P2.x: 1

P2.y: 0

P2.a: 0

P2.d: 0.000000

Une bonne lecture : C et C++ : Initialisation partielle de la structure automatique

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X