[英]Error at execution because of realloc
我寫了一個小的控制台程序,將單詞存儲在一個數組中,由
char** test_tab
,然后打印它們。
只要不通過條件realloc()
,程序就可以正常工作
(例如,如果我將size
增加到1000
)。
但是,如果調用realloc()
則程序將在數組打印期間崩潰,這可能是因為那里的內存混亂了。
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
char* get_word();
int main(int argc, char* argv[])
{
size_t size = 100;
size_t nb_pointer = 0;
char** test_tab = malloc(size * sizeof *test_tab);
char** temp_tab;
while((*(test_tab + nb_pointer) = get_word()) != NULL)
{
nb_pointer++;
if(nb_pointer >= size)
{
size += 100;
temp_tab = realloc(test_tab, size);
if(temp_tab != NULL)
test_tab = temp_tab;
else
{
free(test_tab);
exit(1);
}
}
}
for(nb_pointer = 0; *(test_tab + nb_pointer) != NULL; nb_pointer++)
printf("%s\n", *(test_tab + nb_pointer));
free(test_tab);
return 0;
}
有人可以在這里解釋我在做什么錯嗎? 謝謝。
重新分配中的內存量計算不正確。
temp_tab = realloc(test_tab, size);
應該
temp_tab = realloc(test_tab, size * sizeof *test_tab);
每次您嘗試推入一個琴弦,並同時帶走所有先前推入的琴弦時。 現在,字符串表示char *
&,因此您需要使用sizeof(char*) * size
&然后需要將內存再次分配給字符串以存儲實際字符。 但是,您也可以采用這種方式
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
static int size = 0; // static global means no risk while including this file
char** push(char** memptr, char* data) {
size++;
if (size == 1)
memptr = (char**)malloc(size * sizeof(char*));
else
memptr = (char**)realloc(memptr, size* sizeof(char*));
memptr[size - 1] = (char*)malloc(sizeof(char) * strlen(data) + 1);
strncpy(memptr[size - 1], data, strlen(data));
memptr[size - 1][strlen(data) -1] = '\0'; // over writing the `\n` from `fgets`
return memptr;
}
int main() {
char buf[1024];
int i;
static char** memptr = NULL;
for (i = 0; i < 5; i++){
fgets(buf, 1024, stdin);
memptr = push(memptr, buf);
}
for (i = 0; i < size; i++)
printf("%s\n", memptr[i]);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.