访问函数内的动态分配结构

时间:2015-01-12 14:45:39

标签: c function struct

在下面的代码中,我想访问在函数内动态分配的结构元素。我已经全局声明了结构,但是在fun1()中分配了。收到结构元素后,我无法访问结构元素。请在我出错的地方帮助我。如果它是单一功能,这可以正常工作。提前致谢。

struct s1
{
    int a;
    char b[10];
} *s2;

int val;
void main()
{
    fun1();
    fun2();

    printf("\n Element a %d",(s1->a));
}

fun1()
{
    struct s1 *s2=malloc(sizefof(struct s1)*val);
    recv(fd,(void)&s2,sizeof(struct s1),0);
}

fun2()
{
    printf("\n Element a %d",(s1->a));
}

2 个答案:

答案 0 :(得分:0)

我可以看到一些问题,假设int val;已初始化且价值合理

  1. 您没有检查malloc的返回值,这不是问题所在,但这也取决于val的值。

    < / LI>
  2. 您将指针的地址传递给recv

  3. fun2()完全没有意义,代码甚至不应该编译。

  4. 您在s2中重新声明fun1(),这似乎不是您想要的,因为您最初声明s2全球。

  5. printf()中的main()声明也被破坏。

  6. 注意:在4和5中,您应该注意到s1是结构的名称,这是一个非常糟糕的选择,几乎是您混淆的第一个来源。< / p>

    所以fun1()应该重新

    fun1()
    {
        s2 = malloc(sizefof(*s1) * val);
        if (s2 != NULL)
            recv(fd, s2, val * sizeof(*s2), 0);
    }
    

    fun2()

    fun1()
    {
        if (s2 != NULL)
            printf("\n Element a %d", s2->a);
    }
    

答案 1 :(得分:0)

这里有很多混乱。

这样的事情可能就是你所追求的:

struct s1
{
    int a;
    char b[10];
};

struct s1 * fun1(int val)
{
    struct s1 *s = malloc(val * sizeof *s);
    if(s != NULL)
      recv(fd, s, val * sizeof *s, 0);
    return s;
}

void fun2(struct s1 *ptr)
{
    printf("First element's a %d", ptr[0].a);
}

int main(void)
{
    struct s1 *data = fun1(100);
    fun2(data);

    printf("First element's a is %d", data[0].a);
    return 0;
}

请注意,recv()也可能失败,应该检查。它也应该是read()

基本上我删除了全局变量,并修复了分配和指针使用中的基本错误。