c - 每当我尝试释放旧内存时,我的程序就会崩溃
问题描述
所以基本上有一个函数可以分配一个新的指针内存,当我尝试解除旧的指针内存时,程序基本上会使我的代码崩溃
char** AddingToTheBook(char** original, int* size, char *number)
{
char** newArray = (char**)malloc(sizeof(char*)*(*size));
//allocating and copying the values
for (int i = 0; i < *size; i++)
{
*(newArray + i) = (char*)malloc(sizeof(char)*(strlen(*(original + i))));
strcpy(*(newArray + i), *(original + i));
}
//allocating a new memory to the new number
*(newArray + (*size)) = (char*)malloc(sizeof(char)*strlen(number));
strcpy(*(newArray + (*size)), number);
(*size)++;
//delocating the allocated memories
for (int i = 0; i < size; i++)
free(original[i]);
free(original);
return newArray;
}
解决方案
您可以改用 realloc
char** AddingToTheBook(char** original, size_t oldsize, char *number)
{
char** tmp = realloc(**original, (oldsize + 1) * sizeof(char *));
if(tmp)
{
tmp[oldsize] = malloc(strlen(number) + 1'
if(tmp[oldsize])
{
strcpy(tmp[oldsize], number);
}
else
{
/* do something for example realloc back to the old size */
tmp = NULL;
}
}
return tmp;
}
正确用法示例
char **tmp = AddingToTheBook(book, size, "Test String")
if(tmp)
{
book = tmp;
size++;
}
else
{
/* do something adding to book failed */
}
推荐阅读
- c# - 如何在 C# windows 窗体中显示二维数组?
- c# - 何时检查 InnerException
- web-services - Camel Restlet 异步向客户端发送响应
- javascript - 光滑的垂直滑块问题
- c++ - 如何减少应用程序的 CPU 使用率?
- sql-server - 如何使用 SSIS 从 ActiveMQ 队列中读取数据?
- ionic-framework - Uncaught (in promise):导航堆栈至少需要一个根页面
- sap - SAP HANA | 截断分区
- c++ - 是否将参数加载到空函数的缓存中?
- cobol - + COBOL 中第 7 列中的符号