gpt4 book ai didi

C 动态结构(malloc 和 free)

转载 作者:行者123 更新时间:2023-12-02 06:43:24 25 4
gpt4 key购买 nike

我正在尝试学习 C、C++ 编程的基础知识,所以我从“C”开始。我有很多使用 Java 和 VB 进行编程的经验。但是“C”是我想学的。所以我遇到了一个问题,试图理解“malloc”和“free”函数。

我在 Windows 98 上使用 Borland C++ 4.5 和 Visual C++ 6.0。-(只是一个测试环境,想学习非常基础和早期的 Windows 编程)。

引用这段代码:

struct String
{
char *value;
int length;
};
char *initString(const char *value)
{
char *str = (char*)malloc( strlen(value)+1 );
strcpy(str, value);
return str;
}

struct String *InitString(const char *text)
{
struct String *str = (struct String*)malloc( sizeof(struct String) );

str->value = initString(text);
str->length = strlen( str->value );
return str;
}
void freeString(struct String *str)
{
free(str->value);
free(str);
str = NULL;
}
int main(int argv, char *argc[])
{
struct String *theString = InitString("Testring string struct");

printf("String: %s\n", theString->value);
printf("String Length: %d\n", theString->length);

freeString(theString);

printf("\nData: %s", theString->value);

return 0;
}

当这个程序运行时,结果是正确的。
在我调用“freeString(theString)”之后,该函数确实释放了内存并设置了在“freeString()”函数中构造为 NULL,当我传入指向“theString”的指针时,应该释放“main()”中的“theString”,但是当函数返回时:“theString”不是“NULL” .

在 Borland 4.5 上,我仍然可以用“theString->value”调用“printf”并打印字符串。在 Visual C++ 上,程序在调用“printf”时崩溃 - 但“theString”仍然不是“NULL”。当我在 Debug模式下跟踪程序时,“struct”在“freeString()”函数中被释放并且该结构被设置为 NULL,但是当函数返回时“theString”不是 NULL 而“value”是仍然可以在 Borland 上使用,但不能在 Visual C++ 上使用。

所以我想弄明白,这是怎么回事?是否需要取消引用?

提前致谢!

最佳答案

您正在查看 undefined behavior (你在它被释放后使用一个值),所以真的 - 任何事情都可能发生。它可能会崩溃,也可能会“正常”运行

可能发生的是 msvc,至少在 Debug模式下,清零或写入一个特殊的字节模式到您释放的内存中,因此 str->value 指针变得无效并在您取消引用它时崩溃,而 borland 只是释放内存到内存池,但保持不变。

函数中的str=NULL

void freeString(struct String *str)
{
free(str->value);
free(str);
str = NULL;
}

没有实际效果。它只是将本地 str 值设置为 NULL,调用者不受影响。

如果你想将调用者的指针设置为 NULL,你必须传递一个指向该指针的指针,或者在 C++ 的情况下,传递一个对该指针的引用。

void freeString(struct String *&str) //c++
{
free(str->value);
free(str);
str = NULL;
}


void freeString(struct String **str) //c, call it as freeString(&theString);
{
free((*str)->value);
free(*str);
*str = NULL;
}

关于C 动态结构(malloc 和 free),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4550251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com