读书人

结构体动态分配长度的有关问题

发布时间: 2013-07-09 09:50:48 作者: rapoo

结构体动态分配长度的问题
结构体
typedef struct
{
int a;
double *b;
}st


一个返回结构体函数
st fun(int len)
{
st s;
s.a=100;
s.b = new double[len];//这个len不固定,根据函数参数来
……
return s;
}

以上,sizeof(s)始终是8,函数调用无效,返回结果不是实际值,只是内存地址的数字
但是如果不用double *b,结构体里单纯只有int a,这个a是能正常返回的
请大家教教我,怎么分配动态结构体长度,或者说,我这个算法思路,怎么整改?
[解决办法]
st fun(int len)
{
st s;
s.a=100;
s.b = new double[len];//这个len不固定,根据函数参数来
……
return s;
}
?函数返回的只是局部变量.函数尾序后局部变量就无效了.
[解决办法]
结果是对的
double* 是个指针, 它就是地址, sizeof 的话就是 4, 不管它指向的内存有多大.
sizeof 是编译的时候就计算的, 不是运行的时候才计算.
[解决办法]
大致上可以参考以下的方法:


#include <stdlib.h>
#include <stdio.h>

typedef struct
{
int a;
double* b;
}item_t;

item_t* create(int len)
{
item_t* item = (item_t*)malloc(sizeof(item_t));
if(item == NULL) return NULL;

item->a = 100;
item->b = (double*)malloc(sizeof(double) * len);
if(item->b == NULL)
{
free(item);
return NULL;
}
return item;
}

void destory(item_t* item)
{
if(item == NULL) return;
free(item->b);
free(item);
}

int geta(item_t* item)
{
return item->a;
}

void seta(item_t* item, int a)
{
item->a = a;
}

int main(void)
{
item_t* item = create(100);
if(item == NULL) return -1;

seta(item, 0x6502);
printf("%04x\n", geta(item));

destory(item);
return 0;
}


引用:
结构体
typedef struct
{
int a;
double *b;
}st


一个返回结构体函数
st fun(int len)
{
st s;
s.a=100;
s.b = new double[len];//这个len不固定,根据函数参数来
……
return s;
}

以上,sizeof(s)始终是8,函数调用无效,返回结果不是实际值,只是内存地址的数字
但是如果不用double *b,结构体里单纯只有int a,这个a是能正常返回的
请大家教教我,怎么分配动态结构体长度,或者说,我这个算法思路,怎么整改?

------解决方案--------------------


这叫以静制动,
静的部分:
typedef struct
{
int a; //四个字节,确定(根据编译器,可以是其它值)
double *b;//四个字节
}st

而b在堆中根据需要获取空间,这是动的部分,动的部分由静的来管理。

如果按照你的想法,连动的部分也放进来,那就麻烦大了,比如

typedef struct
{
int a; //四个字节,确定(根据编译器,可以是其它值)
double *b;
double *c;}st

现在b长度可变,那就无法确定c的位置了



[解决办法]
真正所谓动态长度的结构体是这样的

struct st
{
int a;
double b[];
};

st *s = reinterpret<st *>(new char[sizeof(st) + sizeof(double) * n]);


这是一个问题很多的方法,而且sizeof(*s)结果是4,不会返回动态分配的长度。因为sizeof的结果永远是在编译的时候就已经决定的,不会因为运行时的内容发生改变。

读书人网 >C++

热点推荐