【发布时间】:2022-01-05 20:24:51
【问题描述】:
我正在尝试制作一个小型库来处理字符串,因为在 C 中处理它们异常复杂。
我有一个这样定义的结构:
typedef struct _String
{
unsigned int size;
char *string;
} String;
这很简单,并且允许我动态更改数组大小(前提是我正确使用它)。
我有一个专门用于创建这种结构的函数,
以及使用指向String 的指针释放内存的函数。
String *create_string(char *chr)
{
String *str = calloc(1, sizeof(unsigned int) + sizeof(chr));
str->string = chr;
str->size = strlen(chr);
return str;
}
void destroy_string(String *str)
{
free(str);
}
但无论如何,我在制作这样定义的连接函数时遇到了问题:
bool concat_string_char(String *str, char *chr)
{
// No use to continue since the passed String isn't initialized
if (str->string == NULL) return false;
// Storing the previous string pointer
char *ptr = str->string;
// Final size after concat
int final_size = str->size + strlen(chr);
// Allocating a new block of memory of size final_size * sizeof(char)
str->string = calloc(1, final_size * sizeof(char));
// Append each characters of orignal string
for (int i = 0; i != str->size; i++)
{
str->string[i] = ptr[i];
}
// append each character of chr
for (int i = 0; i != strlen(chr); i++)
{
str->string[str->size++] = chr[i];
}
// Free the memory allocated by the previous string -> Crash
free(ptr);
return true;
}
正如我所评论的,当我在原始字符串使用的指针处释放内存时会发生崩溃。
包括:
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
您可以尝试使用上面的3个功能如下(前提是您评论free():
int main(void)
{
String *str = create_string("Original");
concat_string_char(str, " Concatenated");
printf("%s\n", str->string);
destroy_string(str);
return 0;
}
回复:https://replit.com/@Mrcubix-Mrcubix/String-test#main.c
/EDIT:输出字符串确实是预期的,这里唯一的问题是释放这个旧指针以不泄漏内存。结束/
我尝试使用 gdb 来查看是否可以调试任何东西,但与往常一样,调试器仅在我找不到崩溃位置的情况下才有用,从不找出问题。
但无论如何,任何人都想指出我的错误并更详细地解释为什么它是错误的,我认为这会提高我在这种情况下对指针的理解。
【问题讨论】:
-
拥有一个minimal reproducible example 包括原始分配等会很有用,而不仅仅是这部分
-
在
concat_string_char函数中使用之前,您是否在尝试释放的指针上使用了 malloc? -
我想看看你是如何创建
str的。我认为str->string没有正确初始化。 -
T0maas,
String是使用 calloc 分配并使用字符串初始化的,让我编辑我的线程以添加那段代码。 -
T0maas 函数按要求添加。
标签: c string pointers memory free