Avatar billede yonzie Nybegynder
14. december 2009 - 17:31 Der er 8 kommentarer og
1 løsning

Kan ikke helt få noget char * returnering til at spille

Jeg har følgende to funktioner. Den første viser en menu med de forskellige bilmærker man kan vælge, den anden returnerer en pointer til bilnavnet.

void showBrands(void) {
    int x;
    for (x=0; x<7; x++) {
        printf("%2d: %s\n", x+1, getBrand(x));
    }
    printf("\n");
}

char *getBrand(int type) {
    char biler[7][9] = {"Audi","BMW","Ferrari","Jaguar","Lexus","Mercedes","Opel"};
    char *bil = biler[type];
    return bil;
}

Mit problem er at output bliver:
[code] 1:
2: BMW
3: Ferrari
4: Jaguar
5: Lexus
6: Mercedes
7: Opel[/code]
i stedet for "Audi" er der blot tomt... Det må vel være pointeren der er i skoven, men hvorfor? Det går kun galt i den første...
Avatar billede arne_v Ekspert
14. december 2009 - 17:37 #1
char *getBrand(int type) {
    // alloker 7*9 bytes paa stakken
    char biler[7][9] = {"Audi","BMW","Ferrari","Jaguar","Lexus","Mercedes","Opel"};
    // saet bil til at pege et sted i de 7*9 bytes
    char *bil = biler[type];
    // returner en kopi af den pointer ***OG*** frigiv de 7*9 bytes
    return bil;
}

du staar med en pointer som peger paa noget memeory der genbruges til andre formaal.
Avatar billede arne_v Ekspert
14. december 2009 - 17:38 #2
proev med:


static char biler[7][9] = {"Audi","BMW","Ferrari","Jaguar","Lexus","Mercedes","Opel"};

char *getBrand(int type) {
    return biler[type];
}
Avatar billede yonzie Nybegynder
14. december 2009 - 17:54 #3
Så efter jeg har returneret pointeren, bliver den placering i hukommelsen overskrevet med noget andet med det samme.
God forklaring. Tak!
Avatar billede jesperhgh Nybegynder
14. december 2009 - 19:31 #4
Hvorfor ikke have bilmærkerne som en const??
Avatar billede jesperhgh Nybegynder
14. december 2009 - 19:48 #5
...som arne skriver, så allokeres den lokale variabel på stakken hver gang funktionen kaldes.

hvad ned noget i retning af:

const char[] brands = {"audi", "BMW" .....};

char* getbrand(int index) {
  return &brands[index];
}
Avatar billede arne_v Ekspert
14. december 2009 - 19:53 #6
const er en god ide

den sidste kode tror jeg ikke compiler
Avatar billede yonzie Nybegynder
14. december 2009 - 19:56 #7
Hmm... Jeg venter egentlig bare på et svar fra arne ;)
Avatar billede arne_v Ekspert
14. december 2009 - 20:01 #8
kommer her
Avatar billede jesperhgh Nybegynder
14. december 2009 - 21:01 #9
Du har ret arne, det skal være a'la:

char const *brands[] = {"Skoda", "Hyundai", "Lloyd", "Goggomobil"};

char* getBrand(int index) {
  return brands[index]; 
}

void showBrands(void) {
  char* brand = getBrand(2); /* 2 er index for Lloyd */
  puts(brand);  /*  Lloyd  */
}

...jeg er blevet lidt rusten i min c-muskel ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester