0

以下のテストプログラムを作成しました。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char **messages = NULL;
int messageCount = 0;

void addMessage(char *message) {
    messages = realloc(messages, messageCount * sizeof(char *));
    if(messages == NULL) {
        printf("Unable to realloc");
        return;
    }
    messages[messageCount] = malloc(255 * sizeof(char));
    if(messages[messageCount] == NULL) {
        printf("Unable to alloc");
        return;
    }
    memset(messages[messageCount], '\0', 255);
    strncpy(messages[messageCount], message, 255);
    messageCount++;
}

void listMessages(void) {
    if(messageCount == 0) return;
    int i = 0;
    for(i = 0; i < messageCount; i++) {
        printf("%s\n", messages[i]);
    }
    printf("\n");
}

int main(void) {
    addMessage("This");
    listMessages();
    addMessage("is");
    listMessages();
    addMessage("a");
    listMessages();
    addMessage("test");
    listMessages();
    addMessage("for");
    listMessages();
    addMessage("dynamic");
    listMessages();
    addMessage("memory");
    listMessages();
    addMessage("allocation");
    listMessages();
}

私がやろうとしていることは自明です。

プログラムがクラッシュする前に、次の出力が得られます。

This

This
is

This
is
a

This
is

「Unable to realloc」または「Unable to alloc」メッセージを受け取っていないことに注意してください。

では、なぜクラッシュするのでしょうか。

4

3 に答える 3

1
  1. メモリを割り当てる前の messageCount ++。

  2. messages = realloc(messages, messageCount * sizeof(char *));

    if(messages == NULL) {

        printf("Unable to realloc");
        return;
    }
    messages[messageCount] = malloc(255 * sizeof(char));//here is wrong `
    

messageCount のメモリを割り当てます。使用できる最大インデックスは次のとおりです。messageCount-1!

常に使用する必要があります:

messages[messageCount-1] = malloc(...)

の他の場所も にmessage[messageCount]置き換える必要がありmessages[messageCount-1]ます。

または、配列オーバーフローがあります。

于 2013-08-25T22:18:20.307 に答える
0

問題: 最初のrealloc,messageCountはゼロです。 realloc を呼び出すmessageCountにインクリメントする必要があります。

最初に NULL であることが原因であると前に書いていましたmessagesが、それは実際には問題ではないようです (by @user814064)。

于 2013-08-25T22:15:09.953 に答える