当前位置: 首页 > 知识库问答 >
问题:

动态分配结构中的字符数组存储在哪里?[副本]

金昂熙
2023-03-14

可能重复:
C数组实例化-堆栈还是堆分配?

动态分配包含char指针的结构时,实际的char指针会发生什么情况?它存放在哪里?

一旦结构被释放,char指针是否与它一起被释放?

例如,考虑以下结构:

struct mix
{
    int a;
    float b;
    char *s;
};

typedef struct mix mix;

然后是为其分配内存的以下代码:

int main()
{
    mix *ptr = (mix*)malloc(sizeof(mix));

    ptr->a = 3;
    ptr->b = 4.5f;
    ptr->s = "Hi, there, I'm just a really long string.";

    free(ptr);

    return 0;
}

是否在堆栈上分配了s,然后与ptr一起释放?我可以想象它确实是在堆栈上分配的,因为它不是以任何方式动态分配的(除非malloc有一些我不知道的功能)。我想,对于s来说,“超出范围”将是在释放ptr的时候。还是我完全错了?:)

非常感谢!

共有3个答案

强硕
2023-03-14

当您malloc forptr时,将为结构的所有成员分配内存,包括指针s,这与为结构的任何其他成员分配的内存没有什么不同。

您正在为s分配一个字符串文字,因此它通常存储在只读部分中。否则,您需要对ptr执行malloc-

壤驷骁
2023-03-14

当您使用malloc()动态分配混合时,您实际上是在分配一个内存块来存储混合结构数据成员,即。

  • aninta

当您调用free()时,只需释放该块。

所以,你不分配字符串,你只分配字符串指针。

如果您想动态分配字符串,您必须显式执行(通过对malloc()的另一个调用),并且为了避免内存泄漏,您还应该使用free()显式释放字符串

姚高韵
2023-03-14

名为schar*成员的空间在堆上分配,以及调用malloc()(您不需要强制转换其返回值)后混合的其余成员。分配给s的字符串文字不是在堆或堆栈上分配的,而是实际二进制文件的一部分,并且具有静态存储持续时间。因此:

ptr->s = "Hi, there, I'm just a really long string.";

将字符串文字的地址分配给ptr-

调用free()后,取消引用ptr是未定义的行为。

 类似资料:
  • 问题内容: 在哪里可以在客户端存储配置参数?我无法将参数存储在Servlet初始化参数(web.xml)中(因为我必须使用PHP)。那么如何在客户端存储初始化应用程序参数(例如PHP脚本位置,一些密码等)? 问题答案: 为此,您有以下选择: 将数据存储在客户端代码中。GWT会编译为javascript,最简单的方法是创建一个具有硬编码值的类。 在浏览器中存储数据。您可以使用Cookie或HTML5

  • 然后我上传了游戏控制台的应用程序包,并从Google Play安装到我的手机上。接下来,我在使用该应用程序时下载了模块。但是,在我运行之后,它只显示apk,而没有apk的符号。顺便说一句,似乎安装了模块,因为模块的功能可以正常工作。 我的问题是Google Play将这些动态加载的模块(或APK)保存在哪里。以及是否有任何方法可以使用(例如)访问它们。

  • 当您知道中对象/项的确切数量时,我很想知道内存分配的首选方法是什么对性能(例如,运行时间)有好处Linux。少量对象(少量内存)和大量对象(大量内存)的成本。 例如,类型A【N】vs 请让我知道。非常感谢。 注意:我们可以对此进行基准测试,并可能知道答案。但我想知道解释这两种分配方法之间性能差异的概念。

  • 串的堆分配存储 ,其具体实现方式是采用动态数组存储字符串。 通常,编程语言会将程序占有的内存空间分成多个不同的区域,程序包含的数据会被分门别类并存储到对应的区域。拿 C 语言来说,程序会将内存分为 4 个区域,分别为堆区、 栈区、数据区和代码区,其中的 堆区是本节所关注的。 与其他区域不同,堆区的内存空间需要程序员手动使用 malloc 函数申请,并且在不用后要手动通过 free 函数将其释放。

  • 问题内容: 我正在尝试将非默认URL设置为安装Jenkins的木偶脚本的一部分。我知道如何通过Web UI编辑值,但似乎找不到实际存储值的位置。我已经浏览了jenkins_home文件夹和apache,但尚未找到它。 问题答案: 它将其存储在一个不太可能的位置:在Jenkins主文件夹中。

  • 在Java当我们写作的时候 然后与进行比较,我们得到true作为布尔结果。对相同的解释是字符串常量是在字符串池中创建的,因此这里由S1和s2引用的字符串常量是相同的。还有,如果我们写一些 然后与,我们得到false。原因是S1和S2的引用不同,因为字符串文字是在堆中创建的。 我的问题是,在构造函数中传递的字符串文字“TestString”是在哪里创建的?它与字符串文字/常量相同吗?因此应该在池中创