aksen Temat założony przez niniejszego użytkownika |
sizeof i różne wyniki - dlaczego? » 2019-03-19 21:45:14 Mamy prosty programik: #include <stdio.h>
void x( char tab[] ) { printf( "x: %d\n", sizeof( tab ) ); }
int main( void ) { char tab[ 100 ]; printf( "main: %d\n", sizeof( tab ) ); x( tab ); return 0; }
wykonanie programu: main: 100 x: 8
Dlaczego sizeof w funkcji 'main' daje wynik 100?, a w funkcji 'x' 8? (wygląda na to, że w 'x' jest wypisywany rozmiar wskaźnika, a nie tablicy) Czy żeby w funkcji 'x' mieć poprawny rozmiar tablicy 'tab' zdefiniowanej w 'main' muszę jej rozmiar przekazać jako osobny parametr funkcji? Nie ma innej metody? |
|
jankowalski25 |
» 2019-03-19 22:40:45 Tak, to musi być osobny argument. sizeof zwraca tutaj rozmiar wskaźnika, bo tak właśnie są przekazywane tablice. Można również oznaczyć koniec w charakterystyczny sposób (na przykład znakiem zerowym i wywołać strlen() ). |
|
nanoant20 |
» 2019-03-19 23:11:33 mozesz skorzystac z kontenera tablicy (std::vector) wtedy nie bedziesz musial przesylac drugiego parametru
@jankowalski25 & @aksnet oczywiscie macie racje ANSI C, nie spojrzalem 'mea culpa mea culpa mea maxima culpa'
|
|
jankowalski25 |
» 2019-03-19 23:22:47 Autor tematu pisze raczej w C, więc std::vector w takim przypadku odpada. Oczywiście nic nie stoi na przeszkodzie, aby utworzyć odpowiednią strukturę i zaimplementować taką dynamiczną tablicę. Myślę jednak, że nie ma co strzelać z armaty do wróbla i w takim prostym przypadku wystarczy dorzucić tego jednego inta (nie, bo typ się nie zgodzi, lepiej użyć size_t ) z rozmiarem przekazywanej tablicy. |
|
aksen Temat założony przez niniejszego użytkownika |
» 2019-03-19 23:23:44 >sizeof zwraca tutaj rozmiar wskaźnika
w obu funkcjach sizeof dostaje skaźnik do tablicy, ale wyniki są różne to nie jest do końca jasne dlaczego
>mozesz skorzystac z kontenera tablicy (std::vector) nie, bo program jest w C :) |
|
jankowalski25 |
» 2019-03-19 23:34:50 Wywołując funkcję, przekazujesz tablicę jako argument. Możesz tam przekazać tablicę o dowolnym rozmiarze, więc kompilator wrzuca tam po prostu adres początku tablicy i tyle. Natomiast co do samego rozmiaru, to już samodzielnie decydujesz o tym, jak go określać. Najprościej jest po prostu dorzucić kolejny argument. Dopisano:Aha, a tak poza tym, to zwiększ sobie poziom ostrzeżeń kompilatora. Bo dla takiego kodu GCC rzuca u mnie trzy warningi. Przy czym pierwszy z nich mówi wprost, co zostanie zwrócone przez sizeof : main.c: In function ‘x’: main.c:5:30: warning: ‘sizeof’ on array function parameter ‘tab’ will return size of ‘char *’ [-Wsizeof-array-argument] printf( "x: %d\n", sizeof( tab ) ); ^ main.c:3:14: note: declared here void x( char tab[] ) ^ main.c:5:13: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=] printf( "x: %d\n", sizeof( tab ) ); ^ main.c: In function ‘main’: main.c:11:13: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=] printf( "main: %d\n", sizeof( tab ) ); ^ |
|
pekfos |
» 2019-03-20 00:16:26 w obu funkcjach sizeof dostaje skaźnik do tablicy, ale wyniki są różne to nie jest do końca jasne dlaczego |
Tablica nie jest wskaźnikiem. |
|
« 1 » |