如何释放 C 中作为函数参数传递的字符数组

发布于 2024-12-18 09:12:07 字数 430 浏览 1 评论 0原文

我遇到了一个问题,我不确定这是否是一个问题。我有一个简单的 C 函数,它获取从字符串传递的 char* ,如下所示:



 #include <stdio.h>
 #include <stdlib.h>

int main(int argc, char** argv) {

    passString("hello");

    return (EXIT_SUCCESS);
}

void passString(char * string) {
    // .... some code ....
    free(string); // ???
}

我被教导释放我不再使用的每个内存块(主要是数组)。所以我的想法是也释放字符串,但即使使用这个简单的示例,程序也会冻结或崩溃。我不确定我是否真的需要在这里释放字符串,如果是的话我该如何实现呢?

I came across an issue that I am not sure if it's an issue at all. I have a simple C funcion that gets a char* passed from string like so:



 #include <stdio.h>
 #include <stdlib.h>

int main(int argc, char** argv) {

    passString("hello");

    return (EXIT_SUCCESS);
}

void passString(char * string) {
    // .... some code ....
    free(string); // ???
}

and I was taught to free every memory block that I'm not working with anymore (mainly arrays). So my though was to free string as well but the program freezes or crashes even with this simple example. I'm not sure whether I really need to free string here or not and if so how do I achieve that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

陌若浮生 2024-12-25 09:12:07

您不需要释放未使用malloc分配的内存。

在您的示例中,string 不是由程序中的malloc 分配的,因此您不需要释放它。 string 是一个字符串文字,被分配在只读内存中的某个位置(实现定义)并自动释放。

对于标准粉丝:

参考文献:
c99 标准:7.20.3.2 免费功能

剧情简介
#包括
void free(void *ptr);

描述:
free 函数导致 ptr 指向的空间被释放,即
可供进一步分配。如果 ptr 是空指针,则不会发生任何操作。 否则,如果
该参数与之前由 callocmalloc 返回的指针不匹配,或者
realloc 函数,或者如果已通过调用 freerealloc 释放空间,
该行为未定义

退货
free 函数不返回任何值。

You do not need to free memory which you did not allocate with malloc.

In your example string is not allocated by malloc in your program so you do not need to free it. string is a string literal and is allocated somewhere in the read-only memory(implementation defined) and is automatically freed.

For standerdese fans:

References:
c99 Standard: 7.20.3.2 The free function

Synopsis
#include
void free(void *ptr);

Description:
The free function causes the space pointed to by ptr to be deallocated, that is, made
available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if
the argument does not match a pointer earlier returned by the calloc, malloc,or
realloc function, or if the space has been deallocated by a call to free or realloc,
the behavior is undefined
.

Returns
The free function returns no value.

请别遗忘我 2024-12-25 09:12:07

如果您愿意的话,您要释放的字符串是静态分配的,“在编译期间”。事实上,任何字符串文字("hello")都是这样完成的。您无法释放静态分配的内存,因为它不存在于堆中。

作为一般规则,实际上最好在分配时释放。在这种情况下,如果您要为 "hello" 动态分配空间,您将执行以下操作:

int main(int argc, char** argv) {
    char *s = strdup("hello");
    passString(s);
    free(s);
    return (EXIT_SUCCESS);
}

void passString(char * string) {
    // .... some code ....
}

The string you're freeing is statically allocated, "during compilation" if you will. Indeed any string literal ("hello") is done this way. You cannot free statically allocated memory as it does not live in the heap.

As a general rule, it's actually better to free at the point of allocation. In this case, were you to dynamically allocate space for "hello", you would do this:

int main(int argc, char** argv) {
    char *s = strdup("hello");
    passString(s);
    free(s);
    return (EXIT_SUCCESS);
}

void passString(char * string) {
    // .... some code ....
}
盛夏已如深秋| 2024-12-25 09:12:07

您只需要释放动态分配的内容(通过 C 中的 malloc 或通过 C++ 中的关键字 new)。基本上,对于像 malloc() 这样的任何分配调用,都应该在某个地方有一个 free()

字符串文字不是动态分配的,您不需要关心它们。

You only need to free what you've allocated dynamically (via malloc in C or via keyword new in C++). Basically, for any allocation call like malloc() there should be a free() somewhere.

String literals aren't dynamically allocated and you don't need to be concerned about them.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文