關於元素個數為0的陣列use心得

2021-07-15 18:15:01 字數 1563 閱讀 5558

最近,工作時看了別人的**,有個chance接觸這個0陣列的使用。**中要實現類似這麼個功能:

記憶體中有一段快取區buf,buf前8位元組存倆個int型值,接著是一段字串:

char buf[100];

memset(buf, 0, 100);

int id = 9;

int len = 10;

char msg = "123456";

memcpy(buf, &id, 4);

memcpy(buf+4, &len, 4);

memcpy(buf+8, msg, strlen(msg));

另外,有個結構體定義如下:(別人定義的)

struct ss_t;

**中,有類似下面的一段:

struct ss_t *st;

...st = (struct ss_t *)buf;

將buf強制轉換成struct ss_t型別。

然後對st操作:

當對st->msg操作時,出錯。

printf("%s\n", st->msg);   

顯然,這邊msg只是乙個指標,指標的指向不知道,所以就出錯了。我開始的解決辦法是拋

棄這個結構體直接對buf進行操作,改動頗大。後來,想想,能不能改動小點。記得之前聽過別人說c語言的0陣列,就試試了。把結構體的定義換成:

struct ss_t;

然後再編譯執行,正常工作。其實,結構體對0陣列時沒有分配空間的,但是,相當於定義了乙個陣列,陣列沒有元素,但是,陣列的首位址又是剛好在len之後。引用msg,就相當於對那塊位址操作了。所以,問題順利解決。

此時,sizeof(struct ss_t) = 8;

另外,把其中的0去掉,定義成如下:

struct ss_t;

程式還是照常執行。

此時,sizeof(struct ss_t) = 8。

可見,有沒有0倆者一樣,而且執行效果也一樣。

這裡,msg相當於乙個常量指標.不過, 讀取st->msg:

printf("%s", st->msg);輸出123456

ok,成功了

我寫的乙個完整例子:

#include

#include

#define int_len sizeof(int)

struct ss_t;

int main(void)

memset(buf, 0, 100);

id = 65;

len = 66;

memcpy(buf, &id, int_len);

memcpy(buf + int_len, &len, int_len);

memcpy(buf + 2 * int_len, msg, strlen(msg));  

st = (struct ss_t *)buf;

printf("st->s_id %d st->len %d\n", st->s_id, st->len);

printf("st->msg %s\n", st->msg+1);   

return 0;

}

結構體 類中的彈性陣列 元素個數為0的陣列

彈性陣列存在於形如下面的結構體 class czerotest 類 czerotest中的 int items即為該類的彈性陣列,也可定義為 int items 0 可以發現sizeof czerotest 為4,即彈性陣列的大小為0,不占用空間。之所以稱為彈性陣列,是因為給該型別的指標可以通過ma...

中求解陣列中元素個數 求出陣列中三個和為0的元素

先對陣列排序 固定乙個數 i 以後,採用雙指標的做法,left 和 right,判斷三個數和是否為0,如果和小於0,說明我們需要增加其中的乙個數的數值,就是left自增 如果和大於0,說明我們需要減少其中乙個數的數值,就是right自減。其中關鍵點就是 避免答案中元素的重複出現,所以 需要判斷 陣列...

和為定值的兩個陣列元素

在陣列中找到和為定值的兩個數,返回陣列下標。這個題目就是乙個排序的問題,但是不能改變陣列,用快排的方式儲存陣列的索引值即可,上 include include include include using namespace std void quicksort index int arr,int i...