【问题标题】:Dynamically allocating char pointer pointer动态分配char指针指针
【发布时间】:2013-08-25 22:04:27
【问题描述】:

我创建了以下测试程序:

#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

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

那么为什么会崩溃呢?

【问题讨论】:

  • 你在哪里增加“messageCount”?
  • 所以我知道我有多少条消息,从而知道要分配多少内存?
  • 我的意思是你在尝试写入基于其值分配的内存之后,而不是之前......但我看到你已经接受了指出这一点的答案。
  • 啊,对不起,我以为你说“你为什么……”

标签: c pointers memory dynamic allocation


【解决方案1】:

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

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

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

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

【讨论】:

  • 不错的收获!这让我发疯了;我将 messageCount++ 保留在底部,只是做了一个 realloc(messages, (messageCount + 1) * sizeof(char *)) 。工作一种享受。
【解决方案2】:
  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]

或者,你有一个数组溢出。

【讨论】:

    【解决方案3】:

    问题:在第一个reallocmessageCount为零。 messageCount 应该在 调用 realloc 之前递增。

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

    【讨论】:

    猜你喜欢
    • 2018-08-15
    • 2011-05-23
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    相关资源
    最近更新 更多