Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C] Segfault met printf pointer, maar printf met array werkt

Pagina: 1
Acties:

  • orillion
  • Registratie: April 2006
  • Laatst online: 07:44
Hallo,

Ik heb het volgende stukje code:
code:
1
2
3
4
5
const char *array[] = {"bla", "bla2"};
const char *pointer = &array[0];

printf("adres: %d inhoud: %s\n", pointer, *pointer);
printf("adres: %d inhoud: %s\n", &array[0], array[0]);

Dit print twee keer hetzelfde adres, en bij de array ook de juiste inhoud. Zodra de eerste %s (dus *pointer) wordt geprint, dan segfault het programma. 8)7 Hoe komt dit? Wat doe ik fout?

Alvast bedankt!

  • orillion
  • Registratie: April 2006
  • Laatst online: 07:44
Lekker slim, als ik nou gelijk m'n warnings had gelezen...
Het moet zo:
code:
1
const char **pointer = &array[0];


* orillion gaat zich schamen

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

of zo:
C:
1
2
3
4
5
const char* array[] = {"bla", "bla2"};
char *pointer = array[0];

printf("adres: %d inhoud: %s\n", pointer, pointer);
printf("adres: %d inhoud: %s\n", &array[0], array[0]);


maar da's om het even

Nu met Land Rover Series 3 en Defender 90


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14-11 23:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je code klopt niet, en ik snap niet dat je compiler dit slikt, regel 2 zou gewoon een error moeten geven.

'array' is een array van pointers naar const char. Oftewel, elk element in de array is zelf een const char*. Met &array[0] verkrijg je een pointer naar het eerste element van de array. Aangezien dat element zelf een pointer is, is het resultaat dus een pointer naar een pointer, oftewel in dit geval een const char **.

Door die pointer te dereferencen krijg je de waarde waarde pointer-naar-pointer naar wijst. Maar omdat je 'm hebt gedefinieerd als "const char *", is die waarde dus een char ipv een pointer wat de bedoeling was. Die char heeft weliswaar dezelfde "waarde" als de pointer, maar omdat een char maar 1 byte is en een pointer (afhankelijk van je platform) 4 oid, verlies je dus informatie en gaat de printf() de fout in.

Je zult zien dat als je op regel 2 een extra sterretje plaatst dat het dan wel goed gaat.

.edit: en daar was je inmiddels dus al achter 8)7
MTWZZ schreef op donderdag 16 oktober 2008 @ 14:35:
of zo:
C:
1
2
3
4
5
const char* array[] = {"bla", "bla2"};
char *pointer = array[0];

printf("adres: %d inhoud: %s\n", pointer, pointer);
printf("adres: %d inhoud: %s\n", &array[0], array[0]);


maar da's om het even
Euh, nee, dat is niet hetzelfde als wat de TS bedoelt. Sowieso krijg je nu twee verschillende regels uitgeprint.

[ Voor 20% gewijzigd door .oisyn op 16-10-2008 14:40 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-11 19:52
En nog niemand heeft opgemerkt dat je beter %p dan %d kunt gebruiken voor het printen van pointers? Op LP64 platforms werkt 't anders ook niet zo goed, maar dat is in dit geval misschien niet echt relevant.