100白送了!!有敢进来的没

oyxiaoyu0 2002-09-16 02:47:53
有几个结构体!!
里面我并没有定义它其中每个元素的具体空间是多少!
struct datasource
{
char *name;
char *Memo;
.....
.....
};
因为这个是从数据库中取出的数据,象名字我们可以大体上知道有多大的
可象备注字段也不知道用户输入多少呀!
所以我象能不能实现,动态开辟空间。
也就是说
struct datasource *MyData;
MyData=malloc(sizeof(struct datasource));
MyData->Memo="未知"; //获取用户自己输入的备注信息大小然后在开辟空间,这样可以 节约空间



不知道这样做可以不?
因为我记得以前用链表来做通信录的时候就是一个先定义一个结构体,然后开辟一个结点。然后在通过scanf()来通过控制台输入用户的姓名,年龄,电话等信息。
那这个好象也是动态获取用户输入的大小来开辟空间的吗???

有点蒙了!还望各位大虾指教啊!
...全文
91 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
2002-09-16
  • 打赏
  • 举报
回复
不知道你使用的什么环境,如果支持MFC的话,可以考虑使用CString,它是可以动态的分配内存的。

struct datasource
{
CString name;
CString Memo;
.....
.....
};

这样你最大的好处是不用考虑内存的释放问题。

如果不支持MFC的话,你可以使用
MyData->Memo=(char*)malloc(自定义);
或者MyData->Memo= new char[自定义];

但是你要使用Free或者delete释放内存。


再或者你可以自己写一个支持动态分配的字符串类,模仿CString,也不是很难。我就写过一个。


sclzmbie 2002-09-16
  • 打赏
  • 举报
回复
呵呵,同情~
neosu 2002-09-16
  • 打赏
  • 举报
回复
你的这个结构体很成问题,按我的习惯,如果用结构体,那么所有的数据都是存储在结构体范围内的,也就是不用指针。

否则你malloc没多大用处,也不敢随便清0,还会有内存碎片。

空间浪费一点没关系,把指针改成数组吧。
oyxiaoyu0 2002-09-16
  • 打赏
  • 举报
回复
sclzmbie(梦里红尘) ( )和cwanter(娘子,出来一起看上帝!)

同意你们的想法,这使兄弟突然想起以前在学校期间
用TC来实现复制,粘贴,剪切等操作也是并不知道用户要复制多少东西
只是开辟了一个非常大的缓冲区,然后在读缓冲,根据读到的再开辟实际大小

唉~~~~~~~~~~~~~~长时间不用全都忘了!!!

伤心,结贴~~~
Chiun 2002-09-16
  • 打赏
  • 举报
回复
可以,但你这么做会有很多的内存碎片产生。
everandforever 2002-09-16
  • 打赏
  • 举报
回复
你的结构里面保存指针,内容new出来啊.
shipu 2002-09-16
  • 打赏
  • 举报
回复

我觉得你分配的只是结构体包含指针的内存,每一个指针指向的内存还需要再一次分配,释放时按次序释放。

MyData=malloc(sizeof(struct datasource));
MyData->Memo=(char*)malloc(自定义);
...

shipu 2002-09-16
  • 打赏
  • 举报
回复

我觉得你分配的只是结构体包含指针的内存,每一个指针指向的内存还需要再一次分配,释放时按次序释放。

MyData=malloc(sizeof(struct datasource));
MyData->Memo=(char*)malloc(自定义);
...

cwanter 2002-09-16
  • 打赏
  • 举报
回复
备注型总有个长度限制吧。先做一缓冲区,大小为备注型的长度。先读数据进缓冲区,然后根据数据的大小分配内存,把指针赋值给MyData->Memo。
max_welcome 2002-09-16
  • 打赏
  • 举报
回复
可以阿
bojinyu 2002-09-16
  • 打赏
  • 举报
回复
需要动态的只是memo,而DataSource本身可以随便处理
sclzmbie 2002-09-16
  • 打赏
  • 举报
回复
当然可以了。 你先开一个大的缓冲来度入数据,然后安装数据大小来实际分配空间。不过我建议你还是使用现成的类。

在 MFC 下使用 CMapStringToString 等
在 ATL 7.0 先使用 CAtlMap<CString,CString>
在 C++ 下使用 map 等 STL 类。

自己实现当然可以,不过稳定性和强度需要测试。
oyxiaoyu0 2002-09-16
  • 打赏
  • 举报
回复
问题的关键是
我能不能根据用户输入的大小然后在动态的开辟空间呢!
因为如果是静态的话有的备注字段如果是空的话,我也要开辟255字节的空间!
alaofangel 2002-09-16
  • 打赏
  • 举报
回复
应该可以的 ,但是得先确定最大的空间,这样才不会出问题
guanying 2002-09-16
  • 打赏
  • 举报
回复
其实,如果是
struct datasource
{
char *name;
char *Memo;
};
那么结构体的大小是8,因为一个指针占4个字节。
oyxiaoyu0 2002-09-16
  • 打赏
  • 举报
回复
楼上的,问题不是这里了!
我刚才写错了,你说的对
malloc(sizeof(struct datasource));返回的是一个void*的指针
要把它再转化一下才能用的!


guanying 2002-09-16
  • 打赏
  • 举报
回复
好象可以:MyData=(struct datasource*)malloc(sizeof(struct datasource));

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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