在下面的代码中,我想访问在函数内动态分配的结构元素。我已经全局声明了结构,但是在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));
}
答案 0 :(得分:0)
我可以看到一些问题,假设int val;
已初始化且价值合理
您没有检查malloc
的返回值,这不是问题所在,但这也取决于val
的值。
您将指针的地址传递给recv
。
fun2()
完全没有意义,代码甚至不应该编译。
您在s2
中重新声明fun1()
,这似乎不是您想要的,因为您最初声明s2
全球。
printf()
中的main()
声明也被破坏。
注意:在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()
?
基本上我删除了全局变量,并修复了分配和指针使用中的基本错误。