Rozmiar tablicy char na podstawie wskaźnika.

0

Witam.

Czy istnieje jakikolwiek sposób na dobranie się do faktycznej wielkości tablicy charów do której wskazuje wskaźnik?
Nie chodzi mi o ilość elementów tablicy tylko jej maksymalną potencjalną wielkość.

#include <stdio.h>

int main(void) {

char tekst[30] = "Foobar"; //30 bajtów miejsca na elementy w tablicy
tekst[strlen(tekst)]= '\0';

char* p;

p = &tekst;

printf("%s\n", p); // Foobar
printf("%d\n",sizeof(p)); //4 bo tyle zajmuje wskaznik do chara
printf("%d\n",strlen(p)); // 6 bo tyle znakow kryje sie w tablicy do ktorej wskazuje wskaznik

   return 0;
 }
 

Zakładamy że wielkość tablicy "tekst" nie jest nam znana.
Tzn. właśnie w takiej sytuacji jestem dłubiąc przy pewnym zapuszczonym kodzie.

0

Chodzi oczywiście o język C.
Bardzo proszę moda o poprawienie powyżej i skasowanie tego wpisu.

0

W teorii nie, w praktyce.. powiedzmy, że również nie.

ps. tekst[strlen(tekst)]= '\0'; taka konstrukcja nie jest potrzebna. Literały już w domyśle kończą się znakiem \0, a resztą, jak myślisz: w jaki sposób działa strlen ;)?

0
Rev napisał(a):

W teorii nie, w praktyce.. powiedzmy, że również nie.

Miałem nadzieję że jednak jest jakieś tajemne mojo które by na to pozwoliło ;)

Rev napisał(a):

ps. tekst[strlen(tekst)]= '\0'; taka konstrukcja nie jest potrzebna. Literały już w domyśle kończą się znakiem \0, a resztą, jak myślisz: w jaki sposób działa strlen ;)?

iteruje po tablicy char do której prowadzi wskaźnik i szuka \0 ? ;)

Wiem że z mniej standardowych wynalazów pod win można by użyć msize jednak rozwiązanie powinno banglać pod unixowymi osami także.

Mimo wszystko, gdyby ktoś miał na to jakiś sprytny patent to chętnie poczytam :)

0

Mimo wszystko, gdyby ktoś miał na to jakiś sprytny patent to chętnie poczytam :)

Sprytny patent, to użycie tablicy dynamicznej i alokowanie dokładnie tyle pamięci ile potrzebujesz. Wtedy też od razu będziesz wiedział, jaki ma rozmiar ;)

0
aurel napisał(a):

Mimo wszystko, gdyby ktoś miał na to jakiś sprytny patent to chętnie poczytam :)

Sprytny patent, to użycie tablicy dynamicznej i alokowanie dokładnie tyle pamięci ile potrzebujesz. Wtedy też od razu będziesz wiedział, jaki ma rozmiar ;)

No niestety- na to nie mam wpływu.
Ja dostaję tylko wskaźnik do tablicy charów.
Problem w tym że w C nie znając jej rozmiaru i wrzucając w nią dane łatwo o Segmentation fault a przed tym chciałbym się ustrzec.

0

Ale przecież to Ty jesteś programistą, zrób to tak, żebyś go znał! W C to normalne, że funkcje, które operują na tablicach, jako drugi argument przyjmują rozmiar tej tablicy. Możesz też wskaźnik i rozmiar zawrzeć w strukturze.

Jeżeli używasz MSVC możesz poczytać o _msize, ale raczej nikt nie poleci Ci takiego rozwiązania, bo jest nieprzenośne.

1

No niestety- na to nie mam wpływu.
Ja dostaję tylko wskaźnik do tablicy charów.
Problem w tym że w C nie znając jej rozmiaru i wrzucając w nią dane łatwo o Segmentation fault a przed tym chciałbym się ustrzec.

To idź teraz do tej osoby, co ci daje tylko tablicę charów i jej powiedz, że w takim razie ty jej zwrócisz tylko dane i niech sama sobie wsadza je w tablicę -_-'

Ewentualnie wyjaśnij skąd ty dostajesz ten wskaźnik, że nie możesz dostać więcej danych stamtąd, a musisz modyfikować tablicę charów stamtąd...

0
morty napisał(a):

No niestety- na to nie mam wpływu.
Ja dostaję tylko wskaźnik do tablicy charów.
Problem w tym że w C nie znając jej rozmiaru i wrzucając w nią dane łatwo o Segmentation fault a przed tym chciałbym się ustrzec.

Chcesz nam wmówić że istnieje jakaś biblioteka która daje ci tylko wskaźnik bez podania rozmiaru a ty masz pod ten wskaźnik coś wpisać?
To jest nie możliwe, no chyba że tą bibliotekę pisał ktoś na twoim poziomie wiedzy o C/C++.

0

To jest nie możliwe, no chyba że tą bibliotekę pisał ktoś na twoim poziomie wiedzy o C/C++.
Niestety, twórcy standardu też nie są doskonali.
http://www.gidnetwork.com/b-56.html

Żeby ich nie obrażać, przyjmijmy że pewnie sobie tego dnia popili. Coś jak reformatorzy polskiej ortografii w 1935 kiedy uchwalali, żeby puhar odtąd pisać przez ch.

0

nie jest możliwe dowiedzenie się ile elementów zaalokowaliśmy na stosie, ponieważ na stosie gdy jeszcze nie zainicjalizowaliśmy tablicy znajdują się przypadkowe dane. Nie ma żadnego znaku kończącego tablice. Choć można by było sobie samodzielnie dodać baj zerowy żeby wiedzieć kiedy dana paczka danych się kończy. Chociaż i to nie było by dobrym rozwiązaniem ponieważ kompilator może wstawiać bajty zerowe żeby poprawić adresowanie. Jedynym sposobem jest jakimś cudem dowiedzieć się o ile został przesunięty wskaźnik stosu. Program musiałby pobrać swój własny kod maszynowy oraz zinterpretować tego opcoda
sub esp, "wielkosc_zmiennej"
No chyba ,że kompilator wstawi jedną instrukcję sub esp dla wszystkich zmiennych w ramce stosu wtedy nie będziemy mogli się dowiedzieć która zmienna jest która. Wtedy lipa. Zrób lepiej tak jak @aurel na początku wspominała i zaalokuj pamięć dynamicznie.

0
_13th_Dragon napisał(a):

Chcesz nam wmówić że istnieje jakaś biblioteka która daje ci tylko wskaźnik bez podania rozmiaru a ty masz pod ten wskaźnik coś wpisać?

Nie jest to biblioteka jako tako tylko paskudnie zapuszczony kod, starszy zapewne od części osób które się tu wypowiadają.

_13th_Dragon napisał(a):

To jest nie możliwe, no chyba że tą bibliotekę pisał ktoś na twoim poziomie wiedzy o C/C++.

Nie uważam żeby mój poziom był aż tak straszliwie niski, przecież od początku zakładałem że nydyrydy.
Łatwiej było mieć nadzieję że się da w jakiś sposób którego nie znam, niż przebijać się przez korporacyjny beton i wprowadzać zmiany w pierdylionie miejsc ;)

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