przekazanie adresu na typ const char* jako argument do funkcji

0

Mam mały problem z przekazaniem adresu do funkcji i operowaniu na wskaźniku do const char*
Otóż nie mogę odczytać adresu i wartości tej zmiennej wskaźnikowej.
Dla przykładu:


// NIE DZIALA ( segmentation fault ) z &(*t) też nie działą ( śmieci )
const char* foo(const char* t) {
printf("Value: %s | Address: %p\n", *t, *t);
t = "new value";
}

// dla char* DZIALA

void foo2(char* t)
{
printf("Value: %s | Address: %p\n", &(*t), &(*t));
}

// wywolanie w main:

const char* text = "jakas stala znakowa";
char text2[] = "jakis tekst";

foo(&text);
foo2(&text2);

 

Z foo2 nie ma problemu, ale z const char* jest już problem adresy się nie zgadzają. Tak więc zapisać nowego adresu nie można, mimo, że nie jest to stały wskaźnik tylko pokazuje na stałą znakową.
Jak odczytać adres zmiennej const char* tak aby można było jej coś przypisać czy odczytać ( wyłuskiwanie nic nie daje ).

0

Zarówno foo jak i foo2 są błędne, a to drugie działa tylko dlatego, że stary C pozwalał na dziwne niejawne konwersje.

foo(&text);

text to const char*, czyli &text to const char**

foo(const char* t)

t to const char*, czyli *t to pierwszy znak z tego stringa

void foo(const char* t) 
{
    printf("Value: %s | Address: %p\n", t, t);
    t = "new value";
    printf("After: %s | %p\n", t, t);
}
...
foo(text);
0

Nie chodziło mi o przekazanie wskaźnika na const char* tylko adresu zmiennej wskaźnikowej :)
Bo w końcu chce nie tylko odczytać stałą znakową ale też przypisać nowy adres bazując na "oryginalnej" zmiennej wskaźnikowej.
A to co podałeś to zwykłe kopiowanie adresu na const char* :) I oczywiście przypisanie w ciele funkcji do t = "new value" nie ma wpływu na zmienna przekazaną do funkcji, bo działa na kopii i po zakończeniu funkcji lokalna "t" idzie w kosmos ;) No ale to pewnie wiesz.

Stąd wywołanie funkcji foo(&text)

Nie mniej jednak krótka drzemka potrafi zdziałać cuda i rozwiązanie jest dość oczywiste:

void (const char** t) {
printf("Value: %s | Address: %p\n", *t, *t);
*t = "nowa wartosc"; // przypisuje adres do "oryginalnej" zmiennej
}

Czyli wskaźnik na wskaźnik typu const char*

1 użytkowników online, w tym zalogowanych: 0, gości: 1