【问题标题】:In C, how do I allocate space for my struct?在 C 中,如何为我的结构分配空间?
【发布时间】:2016-06-06 05:28:04
【问题描述】:

我构建了一个函数,我试图用它来为我的结构动态分配内存,就像这样。只是似乎无法让它工作

typedef struct My_Struct
{
    char **array
}MyStruct

MyStruct * createMyStruct(int length)
{
     MyStruct->array = malloc(sizeof(char *) * (length + 1));   
}

int main(void)
{
     MyStruct *new1 = createMyStruct(10);
     return 0;
}

【问题讨论】:

  • 你不能使用MyStruct->arrayMyStruct 是类型名,不是变量名。
  • 你不能“分配你的结构”,但你可以分配你的结构的实例。

标签: c struct dynamic-memory-allocation


【解决方案1】:

分配sizeof(MyStruct) 并转换为 MyStruct ptr 很简单:

MyStruct * createMyStruct(int length)
{
     MyStruct* s = malloc(sizeof(MyStruct));
     s->array = malloc(sizeof(char*) * (length + 1));   
     return s;
}

顺便说一句,通常结构中没有任何指针,而只有具有固定大小的数组或至少一个char*[] 而不是char*,因为结构通常具有固定大小以便更容易分配。 如果你使用我上面的代码,不要忘记分配char*s char** 也是因为我代码中的malloc只分配指针而不是字符串本身

【讨论】:

  • (MyStruct*)(char**) 是不必要的。
【解决方案2】:

您不能使用MyStruct 类型来初始化其字段,因为它们不是静态的。您必须先创建结构实例,对其进行初始化,然后 - 从您的方法返回。

MyStruct * createMyStruct(int length)
{
    MyStruct* pResult = malloc(sizeof(MyStruct)); 
    pResult->array = malloc(sizeof(char *) * (length + 1));
    return(pResult);   
}

用完后别忘了释放内存。

PS: 这段代码也很奇怪:

pResult->array = malloc(sizeof(char *) * (length + 1));

如果你试图初始化相同长度的字符串数组,这是不正确的。您将获得一个length+1 数组,其中包含未初始化的指针。如果您只是分配一个数组以供以后使用 - 那么递增 length 可能是错误的。

【讨论】:

  • 这可能应该成为一个稀疏的“字符串”数组,指针数组以NULL 终止(如main() 中的argv),因此+1 元素将用于哨兵.
  • 可能是,但从问题中不清楚。所以我想,最好指出来)
  • malloc()的调用进行错误检查也很重要。
猜你喜欢
  • 2011-05-03
  • 2020-12-20
  • 2019-10-20
  • 2013-04-21
  • 1970-01-01
  • 2015-12-12
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多