簡體   English   中英

在C中為結構動態分配內存的問題

[英]Problems with dynamic memory allocation for structs in C

我得到了數量未知的“寬符號”。 文本的格式設置為句子,我必須將其添加到結構“文本”中。

這些是我的結構:

struct Sentence {
    wchar_t *sentence;
    int amount_of_symbols;
};

struct Text {
    struct Sentence *sentences;
    int amount_of_sentences;
}; 

我為“句子”結構數組動態分配內存並添加它們。 這是我的輸入代碼:

int amount_of_sentences = 0;
struct Sentence *sentences = (struct Sentence *) malloc(amount_of_sentences * sizeof(struct Sentence));

struct Text text = {sentences, amount_of_sentences};

wchar_t symbol;
int buffer_size = 0;
wchar_t *buffer = (wchar_t *) malloc(buffer_size * sizeof(wchar_t));

bool sentence_begun = true;

while (true) {
    symbol = getwchar();

    if (symbol == '\n')
        break;

    if (sentence_begun && symbol == ' ') {
        sentence_begun = false;
        continue;
    }

    buffer = (wchar_t *) realloc(buffer, (++buffer_size) * sizeof(wchar_t));
    buffer[buffer_size - 1] = symbol;

    if (symbol == '.') {
        buffer[buffer_size] = '\0';

        text.amount_of_sentences++;
        text.sentences = (struct Sentence *) realloc(text.sentences, text.amount_of_sentences * sizeof(struct Sentence));
        text.sentences[text.amount_of_sentences - 1].amount_of_symbols = buffer_size;
        text.sentences[text.amount_of_sentences - 1].sentence = (wchar_t *) malloc(buffer_size * sizeof(wchar_t));
        text.sentences[text.amount_of_sentences - 1].sentence = buffer;

        buffer_size = 0;
        buffer = (wchar_t *) realloc(buffer, buffer_size * sizeof(wchar_t));
        sentence_begun = true;
    }
}

一切似乎都很好,但是當我嘗試輸出所有句子時,並沒有全部顯示出來,有些重復了。

這是我的輸出代碼:

for (int i = 0; i < text.amount_of_sentences; i++) {
    wprintf(L"%ls\n", text.sentences[i].sentence);
}

輸入輸出示例:

adjsand. asdad.a.a. aaaa. adsa.


a.

adsa.
adsa.

此代碼可能有什么問題,我應該更改什么?

首先,您的緩沖區太小1,並且不考慮終止符'\\0' 在程序的頂部,執行以下操作:

int buffer_size = 1;
wchar_t *buffer = (wchar_t *) malloc(buffer_size * sizeof(wchar_t));
*buffer= '\0';

但是真正的問題在於:

    text.sentences[text.amount_of_sentences - 1].sentence =
                (wchar_t *) malloc(buffer_size * sizeof(wchar_t));
    text.sentences[text.amount_of_sentences - 1].sentence = buffer;

    buffer_size = 0;
    buffer = (wchar_t *) realloc(buffer, buffer_size * sizeof(wchar_t));

您為句子分配內存,但是隨后用buffer指針覆蓋了該指針。 接下來,您重置緩沖區大小並重新分配緩沖區。

分配復制緩沖區中的數據。 為此,請執行以下操作:

    strcpy(text.sentences[text.amount_of_sentences - 1].sentence, buffer);

在這里,也要做:

buffer_size = 1;
buffer = (wchar_t *) realloc(buffer, buffer_size * sizeof(wchar_t));
*buffer= '\0';

問題在這里。

    text.sentences[text.amount_of_sentences - 1].sentence = (wchar_t *) malloc(buffer_size * sizeof(wchar_t));
    text.sentences[text.amount_of_sentences - 1].sentence = buffer;

    buffer_size = 0;
    buffer = (wchar_t *) realloc(buffer, buffer_size * sizeof(wchar_t));

您可以使用malloc分配一個新語句,然后使用buffer覆蓋它。 這將泄漏內存。

然后,將buffer分配給text.sentences[text.amount_of_sentences - 1].sentence ,然后通過重新分配buffer釋放該內存。

從C標准...

realloc函數取消分配ptr指向的舊對象,並返回一個指向具有size指定大小的新對象的指針。

text.sentences[text.amount_of_sentences - 1].sentence指向已釋放的內存。 這將導致不確定的行為。

而是指向buffer並分配一個新的buffer

    text.sentences[text.amount_of_sentences - 1].sentence = buffer;

    buffer_size = 0;
    buffer = malloc(buffer_size * sizeof(wchar_t));

其他注意事項...

如Paul所述 ,您需要為空字節分配一個額外的字節。

無需realloc mallocrealloc的結果

在堆棧上分配一個較大的緩沖區以讀取輸入(如果需要的話,增加它)是更簡單,更快和更不容易出錯的錯誤。 然后將內容復制到適當大小的內存中。

我繼續編寫了一個改進的版本進行說明。 如果這是家庭作業,請不要上交。

暫無
暫無

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

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