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