Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

sizeof i różne wyniki - dlaczego?

Ostatnio zmodyfikowano 2019-03-20 00:16
Autor Wiadomość
aksen
Temat założony przez niniejszego użytkownika
sizeof i różne wyniki - dlaczego?
» 2019-03-19 21:45:14
Mamy prosty programik:

C/C++
#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?


P-174218
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()
).
P-174219
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'
P-174220
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.
P-174221
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 :)
P-174222
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 ) );
             ^
P-174223
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.
P-174225
« 1 »
  Strona 1 z 1