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

请注意,我没有收到“无法重新分配”或“无法分配”消息。

那么它为什么会崩溃呢?

4

3 回答 3

1

这是您的代码正在执行的操作:

  1. 用“This”调用 addMessage
  2. 使用 messageCount = 0 调用此函数:messages = realloc(messages, messageCount * sizeof(char *));

然后不断写入未分配的内存。

因此,++messageCount;在 addMessage 的顶部执行 a ,您可以将其从函数底部删除。

于 2013-08-25T22:12:36.430 回答
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是零。 messageCount应该在调用 realloc之前递增。

我之前写过,messages第一次是 NULL 是罪魁祸首,但似乎这不是一个真正的问题(@user814064)。

于 2013-08-25T22:15:09.953 回答