返回结构体的函数

rosekin 2011-11-30 03:18:08
#include <stdio.h>
#include <string.h>

typedef struct tagSTUDENT{
char *name;
int age;
}STUDENT;

typedef struct{
int a;
char b;
}mm;

STUDENT fun();
int main()
{
// STUDENT p=fun();
STUDENT p;
p=fun();
printf("p.age = %d\n",p.age);
printf("p.name = %s\n",p.name);
return 0;
}

STUDENT fun()
{
STUDENT stu;
mm mmt;

stu.age=18;

mmt.a = 23;
mmt.b = 'a';
stu.name = (char *)malloc(sizeof(mm));
memcpy(stu.name, (char *)&mmt, sizeof(mm));

return stu;
}


目的是用fun()函数返回一个结构体,结构体中有一个指针变量,上面的代码在返回的时候有点错,可以运行但是不会出现想要的结果。。。
求指教。
...全文
545 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
rosekin 2011-12-01
  • 打赏
  • 举报
回复
请问:返回结构体的函数在一个文件中,而调用该函数的函数在另一个文件,这样的话内存释放和指针指为空应该在哪个位置。[Quote=引用 3 楼 gaochizhen33 的回复:]

C/C++ code

STUDENT fun()
{
STUDENT stu;
mm mmt;

stu.age=18;

mmt.a = 23;
mmt.b = 'a';
stu.name = (char *)malloc(sizeof(mm));
memcpy(stu.name, (char *)&mmt, sizeof(……
[/Quote]
AnYidan 2011-11-30
  • 打赏
  • 举报
回复
没有仔细看程序,不过返回的结构体肯定是一个copy 而不是指针

xuexingyang 2011-11-30
  • 打赏
  • 举报
回复
函数的局部变量不能返回,函数结束就清空了。
可以传指针。
自信男孩 2011-11-30
  • 打赏
  • 举报
回复
这是正常的,输出的结果你可能看不懂。我们可以剖析一下:23在内存中占四个字节。地位一个字节存放23,高位字节存放0,那么,23转换成字符会是什么字符,我们在终端上看不出来吧。如果你想看一下是什么,你可以使用,比如mmt.a = 0x78787878;其中0x78转换成字符x,然后打印一下。还有一个问题,在对stu.name进行赋值时,首先对其初始化,使用memset(stu.name, 0, 6);为什么是6个字节呢,a占4个字节,a占一个字节,'\0'占一个字节,总共是6个字节。最后你在编译函数,执行以下。结果应该是:p->name=xxxxa.
其实这个问题你要考虑到字符在内存中如何存放的,高地址存什么,低地址存什么。
GKatHere 2011-11-30
  • 打赏
  • 举报
回复
LUA可以
seucs 2011-11-30
  • 打赏
  • 举报
回复
内存分配没有错,返回的也是堆里的指针,但是记得最后释放就行(当然你这程序中也不用释放,当程序运行结束后内存就自动被操作系统回收了),但是你得不到想要的结果仅仅是因为字符串后面没有加null结束符
修改一下fun()就能得到你想要的结果了

STUDENT fun()
{
STUDENT stu;
mm mmt;

stu.age=18;

mmt.a = 23;
mmt.b = 'a';
stu.name = (char *)malloc(sizeof(mm));
memset(&mmt, '\0', sizeof(mm)); // 由于内存对齐,在32位的操作系统上sizeof(mm)
// 应该是8,即4+1+3,最后3个字节是空的
// 这样memset一下就保证了字符串的结束符 '\0'
memcpy(stu.name, (char *)&mmt, sizeof(mm));

return stu;
}

boogiewind 2011-11-30
  • 打赏
  • 举报
回复
函数返回一个局部变量,别的没怎么看
gaochizhen33 2011-11-30
  • 打赏
  • 举报
回复

STUDENT fun()
{
STUDENT stu;
mm mmt;

stu.age=18;

mmt.a = 23;
mmt.b = 'a';
stu.name = (char *)malloc(sizeof(mm));
memcpy(stu.name, (char *)&mmt, sizeof(mm));

return stu;//stu为一个局部变量,在该函数结束时,该变量的生命周期结束,会被释放掉
}

/***************修改结果,没测试***********************/
STUDENT* fun()
{
STUDENT *stu;
stu = (STUDENT *)malloc(sizeof(STUDENT));//动态分配一块内存,由于在堆上分配,不会随函数结束而终结。
mm mmt;

stu.age=18;

mmt.a = 23;
mmt.b = 'a';
stu.name = (char *)malloc(sizeof(mm));
memcpy(stu.name, (char *)&mmt, sizeof(mm));

return stu; //返回内存的指针,不过楼主要注意在主函数中将该内存释放掉 同时主函数p的类型也要做修改 STUDENT *P = NULL;
}


clleady 2011-11-30
  • 打赏
  • 举报
回复
传地址的方式。我改了下代码,我没软件运行,你运行下吧
#include <stdio.h>
#include <string.h>

typedef struct tagSTUDENT{
char *name;
int age;
}STUDENT;

typedef struct{
int a;
char b;
}mm;

void fun(STUDENT *p);
int main()
{

STUDENT *p;
p=fun(p);
printf("p->age = %d\n",p->age);
printf("p->name = %s\n",p->name);
return 0;
}

void fun(STUDENT *p)
{

p->age=18;
mmt.a = 23;
mmt.b = 'a';
stu->name = (char *)malloc(sizeof(mm));
memcpy(stu->name, (char *)&mmt, sizeof(mm));

}
quwei197874 2011-11-30
  • 打赏
  • 举报
回复
楼主返回结构体的指针吧,返回栈内存是会出错啊

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧