由于重新分配而导致执行错误
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;
}
有人能解释一下我做错了什么吗?谢谢。
realloc 中的内存量计算不正确。
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] = '[=10=]'; // 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;
}
我写了一个小的控制台程序,它把单词存储在一个数组中,用
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;
}
有人能解释一下我做错了什么吗?谢谢。
realloc 中的内存量计算不正确。
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] = '[=10=]'; // 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;
}