kerdesek
Andras Tantos
andras at tantosonline.com
Wed Aug 31 22:24:37 CEST 2005
Hali!
>> For non-zero-length arrays, this is the same as a pointer to the first
>> element of the array created by that new-expression. Zerolength arrays do
>> not have a first element.
>>
>> Szoval, akkor megis van 0 hosszusagu tomb?
>
> Ezen vitatkozzanak csak a C tudorok, amint latom, van meg mit
> fejleszteni a szabvanyon :)
> Gondolkozzunk. Egy tombot az elso elemere mutato pointerrel azonosit
> a C. Ha nincs elso elem, hova kell hogy mutasson a pointer?
> Nem letezik ilyen pointer, tehat nem letezik 0 hosszu tomb.
> Q.E.D.
Valami ilyesmirol van szo:
int c = 0;
int *p = new int[c];
delete[] p;
Persze valamivel bonyolultabban, hogy forditasi idoben ne derulhessen ki,
hogy nulla meretu tombot foglalunk le. De mindez, meg egyszer, C++...
>> Megoldaskent ird at uint8_t info[1]-re felteve, hogy a sizeof(ctl) != 0.
>
> Az is mukodik, de miben jobb, mint az uint8_t *info ?
> Tenyleg nem ertem. Nem ugyanazt csinalja?
A kulonbseg a struktura (union) memoria-kioszatasban lesz:
typedef struct IrLMP_Frame {
IrLMP_Head head;
union {
IrLMP_Ctl ctl;
uint8_t info[0];
} u;
} IrLMP_Frame;
Ez a memoriaban igy fog kinzeni:
offset 0: - head elso byte-ja
offset 1: - head masodik byte-ja
....
offset n: - head utolso byte-ja
offset n+1: - opcionalis alignment
....
offset m: - ctl elso byteja, es az info *tomb* elso eleme
offset m+1: - ctl masodik byteja, es az info *tomb* masodik eleme
offset m+2: - ctl harmadik byteja, es az info *tomb* harmadik eleme
offset m+3: - ctl negyedik byteja, es az info *tomb* negyedik eleme
offset m+4: - ctl otodik byteja, es az info *tomb* otodik eleme
....
typedef struct IrLMP_Frame {
IrLMP_Head head;
union {
IrLMP_Ctl ctl;
uint8_t *info;
} u;
} IrLMP_Frame;
Ez a memoriaban igy fog kinzeni (16-bites pointereket feltetelezve):
offset 0: - head elso byte-ja
offset 1: - head masodik byte-ja
....
offset n: - head utolso byte-ja
offset n+1: - opcionalis alignment
....
offset m: - ctl elso byteja, es az info tombre mutato pointer elso byteja
offset m+1: - ctl masodik byteja, es az info tombre mutato pointer masodik
byteja
offset m+2: - ctl harmadik byteja
offset m+3: - ctl negyedik byteja
offset m+4: - ctl otodik byteja
....
Azaz, mig az elso esetben a tomb a struktura (union) resze, addig a masodik
esetben a tomb maga egy fuggetlen memoria-teruleten helyezkedik el es a
struktura (union) csak annak cimet tartalmazza.
A hasznalat soran nincs nagy kulonbseg, de a
foglalas/felszabaditas/masolas/kitoltes bizony nagyon mas tud lenni.
A tomb es a pointer nem ugyanaz a C-ben, ez felreertes. Az mar egy masik
kerdes, hogy a tomb neve, mint kifelyezes (akarcsak pl. a fuggveny neve
egyebkent) a tomb cimet adja vissza, valamit, hogy a [] operator pointereken
mukodik, es nem tombokon.
Remelem igy mar vilagosabb.
Udv,
Tantos Andras
p.s.: eros idegzetuek probaljak ki ezt:
#include <stdio.h>
int a[] = { 4,5,6,7 };
int *b = a+1;
void main() {
printf("%d %d %d %d\n",*a,b[0],a[2],2[b]);
}
More information about the Elektro
mailing list