簡體   English   中英

結構中的可變長度數組

[英]Variable length arrays in struct

我正在用C語言編寫一個應用程序(作為初學者),我正努力在包含可變長度數組的結構中獲取損壞的數據。 我在cprogramming.com和cert.og / secure-coding的論壇帖子中發現了類似的問題。 我以為我已經找到了正確的解決方案,但似乎沒有。

結構看起來像這樣;

typedef struct {
    int a;
    int b;
} pair;

typedef struct {
    CommandType name;
    pair class;
    pair instr;
    pair p1;
    pair p2;
    pair p3;
    CommandType expected_next;
    char* desc;
    int size;
    pair sw1;
    pair sw2;
    pair* data;
} command;

有問題的是“命令”。 對於“命令”的任何給定實例(或任何正確的短語),將設置不同的字段,盡管在大多數情況下,盡管在不同的實例中設置了相同的字段。

我遇到的問題是嘗試設置Expected_next,名稱,sw1,sw2,大小和數據字段時。 而且是數據字段正在損壞。 我正在為這種結構分配內存;

void *command_malloc(int desc_size,int data_size)
{
    return malloc(sizeof(command) +
                  desc_size*sizeof(char) +
                  data_size*sizeof(pair));
}

command *cmd;
cmd = command_malloc(0, file_size);

但是,當我(漂亮)打印生成的cmd時,數據字段的中間似乎是隨機垃圾。 我已經遍歷了gdb,可以看到正確的數據正在加載到該字段中。 看來只有當命令傳遞給另一個函數時,它才會被破壞。 此代碼在函數中調用,例如;

command* parse(char *line, command *context)

精美的圖片出現在另一個函數中;

void pretty_print(char* line, command* cmd)

我以為我做的事正確,但顯然不行。 據我所知,我構建了該結構的其他實例(並為該實例復制了這些方法),但它們中不包含任何可變長度數組,並且它們的漂亮外觀看起來還不錯-這對我來說很擔心,因為它們也可能會斷裂,但斷裂不太明顯。

我正在寫的實際上是一個解析器,因此一個命令傳遞到了parse函數(描述了當前狀態,向解析器提示了下一步的期望),下一個命令(從輸入“ line”派生)是回來。 在解析函數的末尾釋放了“ context”,返回了新命令-然后將其與下一行“輸入”一起傳遞回“ parse”。

誰能提出任何有關為什么可能發生這種情況的建議?

非常感謝。

當您將內存分配給結構時,僅將指針大小分配給* desc。 正如已經指出的那樣,您必須將內存分配給desc指向的空間(數組內容)。 我的回答的目的是說明這樣做的方式略有不同。 由於使用指針* desc可以將結構大小增加一個單詞(sizeof指針),因此您可以安全地在結構中使用可變長度數組,以減小結構大小。

這是您的結構的外觀,請注意desc []已被拉到結構的末尾:

typedef struct {
    CommandType name;
    pair class;
    pair instr;
    pair p1;
    pair p2;
    pair p3;
    CommandType expected_next;
    int size;
    pair sw1;
    pair sw2;
    pair* data;
    char desc[];
} command;

現在,1.為還包括數組大小的命令分配內存:

 command *cmd = malloc(sizeof(command) + desc_length);
  1. 使用desc:

    cmd-> desc [desc_length -1] ='\\ 0';

僅當成員位於結構的末尾,節省結構大小,節省指針間接性時,此技巧才有效。如果數組長度是特定於結構實例的,則可以使用此技巧。

您必須分別分配desc和數據。

分配struct命令* cmd時,將為decs和數據指針分配內存。 Desc和數據必須分別進行malloc。

所以分配你的命令

command *cmd =  malloc(sizeof(command));

然后為數據或desc分配內存
desc的示例:

cmd->desc = malloc( sizeof(char )*100);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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