最近,工作時看了別人的**,有個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...