我创建了以下测试程序:
#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
请注意,我没有收到“无法重新分配”或“无法分配”消息。
那为什么会崩溃?
答案 0 :(得分:1)
以下是您的代码正在执行的操作:
messages = realloc(messages, messageCount * sizeof(char *));
然后不断写入未分配的内存。
所以,在addMessage的顶部做一个++messageCount;
,你可以从函数的底部删除它。
答案 1 :(得分:1)
messageCount ++。
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]
。
或者,你有阵列溢出。
答案 2 :(得分:0)
问题:在第一个realloc
中,messageCount
为零。
在调用realloc之前,messageCount
应该增加。
我之前写过messages
第一次成为NULL是罪魁祸首,但似乎这不是一个问题(@ user814064)。