动态分配char指针指针

时间:2013-08-25 22:04:27

标签: c pointers memory dynamic allocation

我创建了以下测试程序:

#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

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

那为什么会崩溃?

3 个答案:

答案 0 :(得分:1)

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

  1. 使用“This”
  2. 调用addMessage
  3. 使用messageCount = 0调用此函数:messages = realloc(messages, messageCount * sizeof(char *));
  4. 然后不断写入未分配的内存。

    所以,在addMessage的顶部做一个++messageCount;,你可以从函数的底部删除它。

答案 1 :(得分: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 `
    
  3. 您分配了messageCount的内存,您可以使用的最大索引是messageCount-1!

    您需要始终使用:

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

    message[messageCount]的其他地方也应替换为messages[messageCount-1]

    或者,你有阵列溢出。

答案 2 :(得分:0)

问题:在第一个realloc中,messageCount为零。 在调用realloc之前,messageCount应该增加

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