[英]struct and array problem in C
這是問題所在:
我有一個這樣的結構:
struct{
Variable a;
Variable 2;
char ch[1];
}
我需要將ch
指向另一個包含幾個char
數組的struct
。 不,我完全不能更改第一個結構定義。 我只需要一些如何將第二個struct
的第一個字節放入ch[1]
而我根本不知道該怎么做。 請幫我。 謝謝。
您不能將數組“指向”其他對象,因為數組不是指針。 一個char
數組只是一個可以在其中存儲單個char
值的數組。
如果不能將定義從數組更改為指針,則不能使其為“點”。 恐怕就這么簡單。
這是C語言中非常常見的范例。最后一個char只是變量數據的占位符,實際上,您將分配更大的緩沖區並超出1個字符。 這是完全合法的。
您不能更改該結構,但是在調用malloc()
進行分配時,會分配一些額外的字節。
您需要代替char[1]
是一個指針(指向其他結構)。
讓我們給您的結構命名:
typedef struct{
Variable a;
Variable 2;
char ch[1];
} Element;
在您的代碼中:
Element * elt = malloc( sizeof( Element ) + sizeof( CharArrayStruct* ) - 1);
/* fill your struct */
*(CharArrayStruct **)elt.ch = &myCharArrayStruct;
/* later on reading it back */
CharArrayStruct * pcas = *(CharArrayStruct **)elt.ch;
注意elt.ch
是數組開頭的地址,而不是char。 請注意,其內容是OtherStruct*
因此必須將其OtherStruct*
為OtherStruct*
CharArrayStruct**
您可以提出第三個struct
:
struct c {
struct a *a;
struct b *b;
struct c *next;
}
每次要存儲從struct a
到struct b
的關聯時,請將其中一個添加到頭部-當您需要向上查找時,向下走鏈表,在.a
上進行指針比較,直到找到匹配的那個,並返回.b
。
當您使用free()
struct a
對象時,不要忘記從鏈接列表中刪除這些條目,並且當您使用free()
struct b
對象時,也不要忘記將.b
成員設為NULL
。
我認為不可能以安全的方式進行操作,至少除非您處在低內存環境中,否則至少不可能這樣做。 單個字符(這就是您的ch
字段)僅包含1個字節; 這根本不足以指向虛擬內存空間中的任何內存位置。 即使將char
為(void *)
,也無法使用它來處理絕大多數內存。
也許您應該退后一步,告訴我們您實際要實現的目標,而不是告訴您要實現目標所需要做的事情。
如果您的意思是您在實際問題正文中所說的話(“我只需要一些如何將第二個結構的第一個字節放入ch[1]
而我根本不知道該怎么做。”),然后我忽略談論“指向”的第一句話,您可以這樣進行:
struct{
Variable a;
Variable 2;
char ch[1];
} my_struct_that_cant_be_changed;
struct my_other_struct x;
my_struct_that_cant_be_changed.ch[0] = *(char *) &x;
這只是從另一個結構(在變量x
)讀取第一個char
,並將該值分配給第一個結構的1個字符的數組。
請注意,這對我來說似乎毫無意義,但確實可以滿足您的要求。
首先,不清楚您想做什么。 不可能使用一個字節的值“指向”另一個結構。 其次,將第二個結構的第一個字節放在ch [0]中沒有做任何其他事情是沒有意義的。
我懷疑該結構的構造方式是可變長度的結構 。 (其他答案觸及了這個問題,但是它們使用多余的空間來存儲指針,而不是整個字符串。)
通過分配一些額外的字節,您將在內存中獲得以下布局:
+----
| Variable a
| Variable 2 (sic)
| ch[0]
+------ Extra memory below:
| ch[1]
| ...
| ch[N]
+------
您可以通過以下方式分配:
p = malloc(sizeof(Element) + N);
可以訪問像元件p->ch[4]
和訪問ch
如使用字符串p->ch
。
現在,由您決定要用所需的字符串(或其他任何字符串)填充ch
數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.