结构体的动态内存分配问题请教

dsoyy 2009-06-10 11:17:11
struct {
char num[NUM_MENU]; //元素个数 = 类别数目 * 4
uint32 name[NUM_MENU]; //元素个数 = 读取总汉字个数 * 2
char num_name[NUM_MENU]; //元素个数 = 类别数目
char En_name[NUM_MENU]; //元素个数 = 读取总汉字个数
char En_name_num[NUM_MENU]; //元素个数 = 类别数目
uint32 num_lb ;
}lb;

如上面的结构体,其中实际应用时数组大小不同,取决于获取的信息,因此采用动态内存

不知道如何申请和释放,没找到比较合适的资料,请路过的高手帮写一小段代码,申请其中某个元素的内存和释放,感谢中!

仅仅知道非的情况下怎么申请、释放。
...全文
436 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
dsoyy 2009-06-10
  • 打赏
  • 举报
回复
感谢16楼 感谢大家 我先调试下 弄好就给分
飞天御剑流 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 dsoyy 的回复:]
引用楼主 dsoyy 的帖子:
struct {
char num[NUM_MENU]; //元素个数 = 类别数目 * 4
uint32 name[NUM_MENU]; //元素个数 = 读取总汉字个数 * 2
char num_name[NUM_MENU]; //元素个数 = 类别数目
char En_name[NUM_MENU]; //元素个数 = 读取总汉字个数
char En_name_num[NUM_MENU]; //元素个数 = 类别数目
uint32 num_lb ;
}lb;

如上面的结构体,其中实际应用时数组大小不同,取决于…
[/Quote]

那就是我在13楼给你提供的两种方法了.
ameyume 2009-06-10
  • 打赏
  • 举报
回复
那就按照10楼说的那样,先malloc结构体指针对象的内存,再malloc结构体指针成员的内存就可以了
dsoyy 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 dsoyy 的帖子:]
struct {
char num[NUM_MENU]; //元素个数 = 类别数目 * 4
uint32 name[NUM_MENU]; //元素个数 = 读取总汉字个数 * 2
char num_name[NUM_MENU]; //元素个数 = 类别数目
char En_name[NUM_MENU]; //元素个数 = 读取总汉字个数
char En_name_num[NUM_MENU]; //元素个数 = 类别数目
uint32 num_lb ;
}lb;

如上面的结构体,其中实际应用时数组大小不同,取决于获取的信息,因此采用动态…
[/Quote]




澄清一下我要的效果:
struct {
char num[NUM_MENU1]; //元素个数 = 类别数目 * 4
uint32 name[NUM_MENU2]; //元素个数 = 读取总汉字个数 * 2
char num_name[NUM_MENU3]; //元素个数 = 类别数目
char En_name[NUM_MENU4]; //元素个数 = 读取总汉字个数
char En_name_num[NUM_MENU5]; //元素个数 = 类别数目
uint32 num_lb ;
}lb;
NUM_MENU1,NUM_MENU2,NUM_MENU3,NUM_MENU4,NUM_MENU5.这些是宏,目前我设置了定长,但是浪费很多内存,所以我希望这些长度是动态的,因此希望通过使用malloc来代替原来的宏。就是改变上面的写法
飞天御剑流 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 dsoyy 的帖子:]
struct {
char num[NUM_MENU]; //元素个数 = 类别数目 * 4
uint32 name[NUM_MENU]; //元素个数 = 读取总汉字个数 * 2
char num_name[NUM_MENU]; //元素个数 = 类别数目
char En_name[NUM_MENU]; //元素个数 = 读取总汉字个数
char En_name_num[NUM_MENU]; //元素个数 = 类别数目
uint32 num_lb ;
}lb;

如上面的结构体,其中实际应用时数组大小不同,取决于获取的信息,因此采用动态…
[/Quote]

重新看了下你的描述,总算明白你想说啥了,你的问题可以有两种解决方法:

一是用c99的编译器,例如gcc,c99支持VLA可变长数组,可以在运行期定义自动数组,就是那个NUM_MENU可以是变量。

二是用指针了,定义为:


struct
{
char* num; //元素个数 = 类别数目 * 4
uint32* name; //元素个数 = 读取总汉字个数 * 2
char num_name[NUM_MENU]; //元素个数 = 类别数目
char En_name[NUM_MENU]; //元素个数 = 读取总汉字个数
char En_name_num[NUM_MENU]; //元素个数 = 类别数目
uint32 num_lb ;
}lb;


然后lb.num = (char*)malloc(sizeof(char)*数量);
dsoyy 2009-06-10
  • 打赏
  • 举报
回复
5楼和7楼的意思我懂了 ,按照我目前的理解整理一下,请大家看看:
struct {
char *num; //元素个数 = 类别数目 * 4
uint32 *name; //元素个数 = 读取总汉字个数 * 2
char *num_name; //元素个数 = 类别数目
char *En_name; //元素个数 = 读取总汉字个数
char *En_name_num; //元素个数 = 类别数目
uint32 num_lb ;
}lb;


申请:lb.num = (char *)malloc(sizeof(char) * 100);
释放:free(lb.num);



  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
[Quote=引用楼主 dsoyy 的帖子:]
struct {
char num[NUM_MENU]; //元素个数 = 类别数目 * 4
uint32 name[NUM_MENU]; //元素个数 = 读取总汉字个数 * 2
char num_name[NUM_MENU]; //元素个数 = 类别数目
char En_name[NUM_MENU]; //元素个数 = 读取总汉字个数
char En_name_num[NUM_MENU]; //元素个数 = 类别数目
uint32 num_lb ;
}lb;

如上面的结构体,其中实际应用时数组大小不同,取决于获取的信息,因此采用动态…
[/Quote]

这样直接
struct lb *pt;//定义一个指向结构体的指针变量

//申请内存
pt = (struct lb *)malloc(sizeof(struct lb));

可是如果你是这样声明的

struct {
char num[NUM_MENU]; //元素个数 = 类别数目 * 4
uint32 name[NUM_MENU]; //元素个数 = 读取总汉字个数 * 2
char *num_name; //元素个数 = 类别数目
char En_name[NUM_MENU]; //元素个数 = 读取总汉字个数
char En_name_num[NUM_MENU]; //元素个数 = 类别数目
uint32 num_lb ;
}lb;

这样就在上面操作完后,还要

pt->num_name=(char*)malloc(N*sizeof(char)); //这样就是动态2维分配
飞天御剑流 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dsoyy 的回复:]
楼上,我希望这样lb.num[]申请一个大小,lb.name[]申请另外一个大小。。。。。。

诸如此类
[/Quote]

num和name已经是数组了啊,已经有空间了,不需要再申请。

我觉得你没有准确表达你想达到什么效果。
ameyume 2009-06-10
  • 打赏
  • 举报
回复
楼主结构体里面的元素都是固定长度的了,又不是指针,怎么申请“其中某个元素的内存”呢?
nicky_zs 2009-06-10
  • 打赏
  • 举报
回复
int num[N];
数组定义成这样的话,N必须是编译时已知的一个常数。这样是无法动态给num数组分配空间的,因为它占用的空间大小在编译的时候就已经确定了,就是N * sizeof(int)。

要给数组动态分配空间的话,需要把数组定义成指针的形式:
int *num;
这样,在分配的时候,就用 num = (int *)malloc(sizeof(int) * the size you need);
在释放的时候就用 free((char *)num);
飞天御剑流 2009-06-10
  • 打赏
  • 举报
回复
不想要结构标记的话,可以用typedef:


typedef struct
{
char num[NUM_MENU]; //元素个数 = 类别数目 * 4
uint32 name[NUM_MENU]; //元素个数 = 读取总汉字个数 * 2
char num_name[NUM_MENU]; //元素个数 = 类别数目
char En_name[NUM_MENU]; //元素个数 = 读取总汉字个数
char En_name_num[NUM_MENU]; //元素个数 = 类别数目
uint32 num_lb ;
}lb;


这样,lb就成为这结构体类型的别名了,可以如下使用:

lb* lbPointer = (lb*)malloc(sizeof(lb));
The_facE 2009-06-10
  • 打赏
  • 举报
回复
我理解的不知道对不对,你的这个结构体里,每一个字符串都是变长的?

如果是这样,在纯C下,用数组写恐怕不行了,估计得全部改为指针,每个指针都要从堆上开辟内存。
dsoyy 2009-06-10
  • 打赏
  • 举报
回复
楼上,我希望这样lb.num[]申请一个大小,lb.name[]申请另外一个大小。。。。。。

诸如此类
goodname 2009-06-10
  • 打赏
  • 举报
回复
你应该为这个结构体命个名
比如
struct lb_name{
char num[NUM_MENU]; //元素个数 = 类别数目 * 4
uint32 name[NUM_MENU]; //元素个数 = 读取总汉字个数 * 2
char num_name[NUM_MENU]; //元素个数 = 类别数目
char En_name[NUM_MENU]; //元素个数 = 读取总汉字个数
char En_name_num[NUM_MENU]; //元素个数 = 类别数目
uint32 num_lb ;
}lb;

那么
struct lb_name *p;//定义一个指向结构体的指针变量

//申请内存
p = (struct lb_name *)malloc(sizeof(struct lb_name));

if(p == NULL)//申请出问题了
{

}

//这样使用成员
strcpy(p->num,"123");
p->num_lb = 1;

//释放掉申请的空间
free(p);

大致就这样的流程
飞天御剑流 2009-06-10
  • 打赏
  • 举报
回复
你这个结构体的定义需要修改一下,要把结构标记加上,否则无法再定义一个指向该结构体的指针,如下:


struct Info
{
char num[NUM_MENU]; //元素个数 = 类别数目 * 4
uint32 name[NUM_MENU]; //元素个数 = 读取总汉字个数 * 2
char num_name[NUM_MENU]; //元素个数 = 类别数目
char En_name[NUM_MENU]; //元素个数 = 读取总汉字个数
char En_name_num[NUM_MENU]; //元素个数 = 类别数目
uint32 num_lb ;
}lb;


然后就可以分配内存了:

struct Info * InfoPointer = (struct Info *)malloc(sizeof(struct Info));
haitanshangdeyu 2009-06-10
  • 打赏
  • 举报
回复
申请的时候应该可以这样吧
lb *p;
p=(lb *)malloc(sizeof(lb));
释放的时候free(p);不就可以了么?
或许我想的太过简单了~~不知道是不是楼主想要的~~

69,380

社区成员

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

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