Pole ukazatelů problému

hlasů
3

Zkoušel jsem tento příklad pole ukazatelů. Dostávám chybu „Illegal inicializace ve funkci main“

int main()
{
    int a[]={1,2,3,4,5};
    int b[]={1,2,3,4,5};
    int c[]={1,2,3,4,5};
    int *p[3]={a,b,c};
    int i;
    clrscr();
    for(i=0;i<3;i++)
        printf(%d - %u\n,*p[i],p[i]);
    getch();
}

Mám-li použít static int namísto int v prohlášení pole, to funguje dobře. Může mi někdo říct, účinek statické zde. Díky moc.

Položena 14/02/2009 v 19:30
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
4

To kompiluje pokutu s gcc a gcc -ansi. gcc -ansi -pedantic však dává následující upozornění:

blackjack.c: In function ‘main’:
blackjack.c:8: warning: initializer element is not computable at load time
blackjack.c:8: warning: initializer element is not computable at load time
blackjack.c:8: warning: initializer element is not computable at load time

Zatímco linka 8:

int *p[3]={a,b,c};

Jak já to vidím, že problém je, že v té době a, b, c a bude uložen v p, které ještě neexistují. To proto, že bude kladen na zásobníku a umístění v zásobníku závisí na věci mimo rozsah funkce. Za tímto účelem objasnění, ‚doba načítání‘ se rozumí doba je program načten do paměti, není vhodná doba je již v provedení. (Neptejte se mě, proč / jak to funguje stejně)

Odpovězeno 14/02/2009 v 19:52
zdroj uživatelem

hlasů
5

V gcc vidíte varování o tom, pokud používáte -pedantic vlajku.

Ale to je zřejmě něco, co změnilo v normě, v C90 to říká:

Všechny tyto výrazy v inicializátor pro objekt, který má statické dobu skladování, nebo v seznamu inicializátor pro objekt, který má agregační nebo sjednocovací typ musí být konstantní výrazy

a to nebylo dovoleno, protože p pole je typ kameniva, ale v C99 máme:

Všechny tyto výrazy v inicializátor pro objekt, který má statickou dobu skladování musí být konstantní výrazy nebo řetězcové literály.

Odpovězeno 14/02/2009 v 19:53
zdroj uživatelem

hlasů
0

pokusu: printf ( "% d -% u \ n", * (p [i]), p [i]);

i když mám pocit, že se snažíte udělat něco jako:

int a[]={1,2,3,4,5};
int b[]={1,2,3,4,5};
int c[]={1,2,3,4,5};
int *p[3]={a,b,c};
int i;
clrscr();
for(i=0;i<sizeof(p)/sizeof(int*);i++) {
    for (int j =0; j < sizeof(a)/sizeof(int); j++) {
        printf("%d - %u\n",(p[i])[j],p[i]);
    }
}
getch();
Odpovězeno 14/02/2009 v 20:15
zdroj uživatelem

hlasů
0

Pravidla jsou poměrně simple.For statické objekty seznam inicializace by měla být constant.No tato omezení existují pokud jde o prvky, které budou přiděleny místo na zásobníku. Zdá se logické, také, jak třeba uvádět v datové sekci statické objekty a kompilátor musí být schopen vyřešit jejich hodnoty předem. Na paměť stack je přiděleno, jakmile funkce v pochybnost (hlavní) je called.So žádný problém there.I nevím proč opačné chování na turbo-c. Na gcc k tomu dojde: (na kompilaci s gcc -Wall prog.c

        int *p[]={a,b,c} //works fine
        static int *p[]={a,b,c} //oops blunder
Odpovězeno 25/11/2011 v 03:40
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more