Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Hejka
Mały programik:
#include <stdio.h>
#include <stdlib.h>
/* struktura stanowiaca jednostke danych.
* zawiera konkretnr dane i opis ich typu */
typedef struct {
unsigned char descriptor;
void *dataEntity;
} dataStruct;
/* sluzy do wyciagania danych z struktury
* dataStruct */
void *printValue(dataStruct data){
if( data.descriptor =='s' )
return (char *)data.dataEntity;
else if( data.descriptor =='i' )
return (int *)data.dataEntity;
else if( data.descriptor =='d' )
return (double *)data.dataEntity;
return NULL;
}
/* ############## MAIN ################## */
int main(int argc, char *argv[]){
char string[] ="Ala ma kota";
int number =1024;
double dnumber=120.45642;
int count;
dataStruct *chain;
chain =(dataStruct *)malloc(3*sizeof(dataStruct));
chain[0].descriptor ='s';
chain[0].dataEntity =string;
chain[1].descriptor ='i';
chain[1].dataEntity =&number;
chain[2].descriptor ='d';
chain[2].dataEntity =&dnumber;
return 0;
}
I pytanko -ile miejsca zajmują kolejne elementy lancucha chain[0].descriptor, chain[1].descriptor i chain[3].descriptor skoro sam typ void* zajmuje 4B?
Pozdrawiam
Offline
typy w jezyku c nie maja sztywnych ograniczen co do rozmiaru, dlatego nalezy uzywac funkcji sizeof().
Offline
Hej
Chyba źle sformułowałem pytanie.
double numbers[20];
void *cos;
cos=numbers;
Wydaje mi się że elementy tablic cos i numbers powinny zajmować tyle samo miejsca w pamieci, a jest:
sizeof(cos) =4 /* tyle zajmuje wskaźnik void
sizeof(*cos)=1 /* tyle zajmuje void
A przecierz double będzie zajmować 8B
Jakieś pomysły?
Pozdrawiam
Offline
Z tym *void jest chyba tak ze wskazuje na pierwszy bajt elementu.
>>double numbers[20], *double_ptr;
>>void *cos;
>>cos=numbers;
>>sizeof(cos) =4 /* tyle zajmuje wskaźnik void
>>sizeof(*cos)=1 /* tyle zajmuje void
double_ptr=numbers;
sizeof(double_ptr)=4
sizeof(double_ptr)=8
Tak samo jest z malloc(). Zwraca wskaznik do pierwszego bajtu obszaru pamieci ktory zostal przydzielony.
Offline
To by się zgadzało... :)
I całe szczęście bo wykożystanie void* to chyba jedyny sposób na zrealizowanie kontenera o optymalnej wielkości w C.
Dzięki za rozwianie wątpliwości
Offline