【问题标题】:Do structure members have to be separately allocated when using dynamic memory allocation?使用动态内存分配时是否必须单独分配结构成员?
【发布时间】:2015-01-09 22:56:00
【问题描述】:

我有点难以理解动态内存分配如何与结构一起工作。如果我有这样的结构:

struct mystruct
{
    char *a;
    int  *b;
    char *c;
};

如果我为一个结构动态分配内存,我是否还必须为其中的char* 分配内存?

【问题讨论】:

  • 不,struct的成员是struct的一部分,所以如果你有一个50个mystructs的数组,那么每个数组元素都会包含ab这三个指针和c。 (当然这与指针指向的内容无关。)

标签: c memory-management data-structures


【解决方案1】:
  • 如果有人从字面上理解您的问题,那么您已经这样做了:

    如果您分配空间来存储 mystruct 类型的对象,则您为 所有 成员分配空间,即使它们是指针

  • 如果有人预先假设 你还没有像程序员一样思考,而且过于草率,答案可能是否定的:

    您为指针分配了内存,而不是让它们指向。

    如果您考虑一下,其他任何事情都会令人惊讶,并且需要编译器具有大量的预知能力和心灵感应能力;
    指针应该指向什么?一个以 0 结尾的字符串?哪一个?长度为MAGICCONSTANT 的缓冲区?为什么不在一个中间?

【讨论】:

  • 如果我没有为指向的指针分配内存,这会产生分段错误吗?是的,我是初学者,几个月前我才开始学习 C。感谢您的帮助跨度>
  • 请记住永远不要使用未初始化的变量,无论它们是否是指针。仅此一项就已经是未定义的行为。一种用于索引/取消引用未初始化指针的常见 UB 肯定是分段错误。不过,不要依赖于没有得到更微妙或更明显的东西。
【解决方案2】:

是的,当你为结构分配memory 时,只分配ab 指针占用的空间。

对于你希望指针指向的内容,你需要再次调用malloc,你应该这样做

struct mystruct *test;

test = malloc(sizeof(*test)); // allocated space for 3 pointers.
if (test != NULL)
{
    test->a = malloc(countOf_As);
    test->b = malloc(countOf_As * sizeof(int));
    test->c = malloc(countOf_Cs);
}

如果您想确定,请检查sizeof(struct mystruc),它将是3 * sizeof(void *)

【讨论】:

  • 如果结构是静态分配的,但它的内容是指针,我是否还必须为其内容分配内存?例如,如果不是 *test 是 test[20],我还需要 malloc对于 test.a、test.b 和 test.c?
  • 是的,如果你想静态分配所有内容,你需要struct mystruct {char a[SOMESIZE]; int b[SOMESIZE2]; char c[SOMESIZE3];};
  • 我会静态分配它们,但我的编译器/IDE 似乎有问题。我问了这个问题,因为我目前正在调试一个程序,该程序由于执行某些操作的行上的错误而失败像这样:test[i].a=otherstructure[3][4].b;编译器说“赋值给具有数组类型的表达式”,只有当 a 和 b(它们都是 char *)是静态分配的。所以对于像我这样的初学者来说,这有点令人困惑,如果你能解释一下,我真的会感激不尽
  • 你的意思是失败?这似乎是一件有效的事情,但是天气test[i] 溢出 struct 的数组是不可能知道的,因为你没有发布足够的代码,有很多原因可能导致该行失败,所以猜测是错误的,解释@ 987654330@或发布代码。
猜你喜欢
  • 2021-02-14
  • 2021-12-09
  • 1970-01-01
  • 2021-08-25
  • 2012-12-26
  • 2022-11-07
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多