簡體   English   中英

C中的結構和數組問題

[英]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 astruct 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM