【问题标题】:C - Struct allocation in functionC - 函数中的结构分配
【发布时间】:2014-08-19 14:27:21
【问题描述】:

我试图在函数内分配一个结构数组,但是当我返回 main 时,就像我刚刚分配的内存已被覆盖。这是我的示例代码:

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

struct Class {
  int students;
  Person * N;
};

struct Person
{
  char * name;
  int age;
};

void allocation(struct Class ** myclasspointer)
{
    struct Class *mytempstruct= malloc(sizeof *mytempstruct); 
    mytempstruct -> students = 10;
    char *n= "My name is...?";

    mytempstruct -> N = malloc (sizeof (mytempstruct -> N) * 10);
    for (i = 0; i < 10; i++) {
        mytempstruct -> N[i].age = i;
        mytempstruct -> N[i].name = malloc (sizeof (char) * (strlen(n));
        strncpy (N[i].name, n, strlen(n));
    }

    *myclasspointer = mytempstruct;
}

int main(void)
{
  int i;
  struct class * MyClass;

  allocation(&MyClass);

  for (int i = 0; i < MyClass.students; i++)
     Prinf("Student %s, age %d: %d \n",  MyClass->N[i].name, MyClass->N[i].age);

  for (int i = 0; i < MyClass->students; i++)
     free(MyClass->N[i]);
  free (MyClass);

  return 0;
}

一旦我回到 main,只有一些值是应该的。我也尝试过改变:

void allocation(struct Class ** myclasspointer)
{
    struct Class *mytempstruct= malloc(sizeof *mytempstruct); 

    char *n= "My name is...?";

    mytempstruct -> N = malloc (sizeof (mytempstruct -> N) * 10);
    for (i = 0; i < 10; i++) {
        mytempstruct -> N[i].age = i;
        mytempstruct -> N[i].name = malloc (sizeof (char) * (strlen(n));
    }

    *myclasspointer = mytempstruct;
}

到:

void allocation(struct Class ** myclasspointer)
{
    myclasspointer= malloc(sizeof *myclasspointer); 

    char *n= "My name is...?";

    myclasspointer-> N = malloc (sizeof (myclasspointer-> N) * 10);
    for (i = 0; i < 10; i++) {
        mytempstruct -> N[i].age = i;
        mytempstruct -> N[i].name = malloc (sizeof (char) * (strlen(n));
    }
}

但我有同样的结果。

【问题讨论】:

  • 您的代码甚至无法编译!
  • strncpy(dst, src, strlen(src))strcpy(dst, src) 相比没有任何作用(除了给某些人一种虚假的安全感)。
  • 代码有什么问题?
  • malloc (sizeof (char) * (strlen(n)); --> malloc (sizeof (char) * (strlen(n)+1));
  • free(MyClass-&gt;N[i]); --> free(MyClass-&gt;N[i].name); 并添加free(MyClass-&gt;N);

标签: c function memory-management struct


【解决方案1】:

首先您需要person 的前向声明。然后改变

mytempstruct -> N = malloc (sizeof (mytempstruct -> N) * 10);  
                                   ^will give the size of pointer instead of structure `person`  

mytempstruct -> N = malloc (sizeof (struct person) * 10);

【讨论】:

  • 谢谢,现在可以了。抱歉,我试着做一个例子而不是发布 wole 程序,我忘了添加太多东西!
【解决方案2】:
    mytempstruct -> N[i].name = malloc (sizeof (char) * (strlen(n)) );
    strncpy (N[i].name, n, strlen(n));

你想错了:

    mytempstruct -> N[i].name = malloc (sizeof (char) * (strlen(n)+1) );
    strncpy (N[i].name, n, strlen(n)+1);

空字符的空格。

【讨论】:

  • 你错过了 malloc 末尾的 )
猜你喜欢
  • 1970-01-01
  • 2020-02-02
  • 2012-06-08
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
相关资源
最近更新 更多