c - 以不正确的方式使用免费时崩溃
问题描述
typedef char* DString;
DString dstring_initialize(const char* str);
int dstring_concatenate(DString* destination, DString source);
void dstring_delete(DString* stringToDelete);
int main(void)
{
DString str1, str2;
str1 = dstring_initialize("hello ");
str2 = dstring_initialize("world");
dstring_concatenate(&str1, str2);
dstring_delete(&str1);
dstring_delete(&str2);
}
DString dstring_initialize(const char* str)
{
char* res = malloc(strlen(str) + 1);
if (res != NULL)
{
strcpy(res, str);
}
return res;
}
int dstring_concatenate(DString* destination, DString source)
{
DString newstr = realloc(*destination, ((strlen(*destination)+1)+ strlen((&source)+1))* sizeof *source);
if(newstr == NULL)
{
printf("Error");
}
strcat(newstr, source);
*destination = newstr;
return 1;
}
void dstring_delete(DString* stringToDelete)
{
assert(stringToDelete != NULL);
free(stringToDelete);
assert(*stringToDelete == NULL);
}
我怀疑我的分配错误或分配的内存释放不正确,因为当我调试代码时,它会卡在该free(stringToDelete);
部分然后崩溃。另一件事是我怀疑该realloc
部分不正确。任何帮助将不胜感激,如果问题很糟糕,请随时发表评论,以便我可以提高我的沟通技巧并进一步改进问题。
解决方案
所以问题是您将 DString* 类型的变量传递给 dstring_delete 并要求它释放它,但是如果我们查看 DString* 我们发现它是 char** 但在 dstring_initialize 等其他函数中,您分配了 res输入 char* 所以你要求编译器释放你从未分配过的东西,这会导致你的代码崩溃:这是新代码,检查它是否有效:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
typedef char* DString;
DString dstring_initialize(const char* str);
int dstring_concatenate(DString* destination, DString source);
void dstring_delete(DString stringToDelete);
int main(void)
{
DString str1, str2;
str1 = dstring_initialize("hello ");
str2 = dstring_initialize("world");
dstring_concatenate(&str1, str2);
dstring_delete(str1);
dstring_delete(str2);
}
DString dstring_initialize(const char* str)
{
char* res = malloc(strlen(str) + 1);
if (res != NULL)
{
strcpy(res, str);
}
return res;
}
int dstring_concatenate(DString* destination, DString source)
{
DString newstr = realloc(*destination, ((strlen(*destination)+1)+ strlen((&source)+1))* sizeof *source);
if(newstr == NULL)
{
printf("Error");
}
strcat(newstr, source);
*destination = newstr;
return 1;
}
void dstring_delete(DString stringToDelete)
{
assert(stringToDelete != NULL);
free(stringToDelete);
stringToDelete = NULL;
assert(stringToDelete == NULL);
}
还有一件事free 不会将 NULL 分配给已释放的指针,它会变成垃圾数据,因此您需要在断言它是否为 NULL 之前将其分配给 NULL
推荐阅读
- c++ - C ++数组交换并找到最小元素
- keras - Keras 的一类分类
- sql-server - SQL Server 复制数据类型从 tinyint 更改为 int
- javascript - Angular / rxJS:combineLatest - 如何处理 404 错误
- python - 使用 pipenv 和 setup.py 安装私有仓库失败
- angular - 模态打开第一个实例而不是正确的一个
- python - 在上传到 S3 存储桶之前将文件存储在临时缓冲区中。蟒蛇烧瓶
- javascript - 如何防止通过单击按钮关闭引导框模式?
- bash - 为 GNU 并行优化我的脚本代码
- javascript - 反应中查询为空时显示的项目