首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-07-09 
结构体动态分配长度的问题结构体 typedef struct {int adouble *b}st一个返回结构体函数st fun(int len)

结构体动态分配长度的问题
结构体 
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的结果永远是在编译的时候就已经决定的,不会因为运行时的内容发生改变。

热点排行