C die gleichen definierten globalen Variablen in verschiedenen Dateien

Lese ich dieser code von hier(in Chinesisch). Es ist ein Stück code, der zum testen von globalen Variablen in C. Die variable a wurde in der Datei definiert t.h die schon zweimal dabei. In der Datei foo.c definiert struct b mit einem Wert und einer main Funktion. In main.c - Datei definiert zwei Variablen, ohne initialisiert.

/* t.h */
#ifndef _H_
#define _H_
int a;
#endif

/* foo.c */
#include <stdio.h>
#include "t.h"

struct {
   char a;
   int b;
} b = { 2, 4 };

int main();

void foo()
{
    printf("foo:\t(&a)=0x%08x\n\t(&b)=0x%08x\n
        \tsizeof(b)=%d\n\tb.a=%d\n\tb.b=%d\n\tmain:0x%08x\n",
        &a, &b, sizeof b, b.a, b.b, main);
}

/* main.c */
#include <stdio.h>
#include "t.h"

int b;
int c;

int main()
{
    foo();
    printf("main:\t(&a)=0x%08x\n\t(&b)=0x%08x\n
        \t(&c)=0x%08x\n\tsize(b)=%d\n\tb=%d\n\tc=%d\n",
        &a, &b, &c, sizeof b, b, c);
    return 0;
}

Nach der Verwendung von Ubuntu-GCC-4.4.3 kompilieren, das Ergebnis ist, wie dies weiter unten:

foo:    (&a)=0x0804a024
    (&b)=0x0804a014
    sizeof(b)=8
    b.a=2
    b.b=4
    main:0x080483e4
main:   (&a)=0x0804a024
    (&b)=0x0804a014
    (&c)=0x0804a028
    size(b)=4
    b=2
    c=0

Variable a und b hat die gleiche Adresse in zwei Funktion, aber die Größe der b geändert hat. Ich kann nicht verstehen, wie es funktionierte!

  • Was ist deine Frage?
  • Verwenden %p für Druck-Zeiger, auch sollten Sie foo zu Ihrem Kopf.
  • Wenn Sie den Konflikt lösen wollen, deklarieren Sie var statisch.
  • Es ist von coolshell (in Chinesisch), richtig?
  • ja, ich lese diese aus coolshell aber nicht verstehen kann, ist klar, deshalb kopiere ich seine code hier zum diskutieren! Sorry für das! Ich habe Hinzugefügt-Anweisung am Anfang.
  • Nein, ich bin nur neugierig, das ist alles. Ich glaube nicht, dass das ein problem ist, da Sie nicht kopieren Sie den gesamten Artikel. Ich persönlich mag es nicht, was erklärt, dass Artikel entweder. Also ich bin froh zu sehen, dass das problem hier besprochen.
  • vielen Dank für Ihre Hilfe!

InformationsquelleAutor liuan | 2013-07-23
Schreibe einen Kommentar