利用malloc如何定义结构体数组(续)?

亚细亚 2011-09-13 05:12:31
定义了一个结构体:
typedef struct {
char meterID[3];
char baseName[60];
char area[6];
}BaseInfo,*LPBaseInfo;
现在想利用alloc来定义一个结构体数组使其满足这样:
BaseInfo_jl[i]->meterID
BaseInfo_jl[i]->baseName
BaseInfo_jl[i]->area
那么这个动态结构体数组如何定义?谢谢!
...全文
1250 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yaxiya 的回复:]

引用 10 楼 apple_lover55 的回复:

引用 6 楼 yaxiya 的回复:
引用 5 楼 pathuang68 的回复:

引用 2 楼 yaxiya 的回复:

引用 1 楼 xin_wu_hen 的回复:

C/C++ code
LPBaseInfo BaseInfo_jl = (LPBaseInfo)malloc(sizeof(BaseInfo)*NU……
[/Quote]

在C或者C++中,检查数组访问越界的工作,是有程序员自己来做的。
亚细亚 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 apple_lover55 的回复:]

引用 6 楼 yaxiya 的回复:
引用 5 楼 pathuang68 的回复:

引用 2 楼 yaxiya 的回复:

引用 1 楼 xin_wu_hen 的回复:

C/C++ code
LPBaseInfo BaseInfo_jl = (LPBaseInfo)malloc(sizeof(BaseInfo)*NUM);

测试:
strcpy(BaseInfo_jl……
[/Quote]
如何定义更严谨一些?
亚细亚 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jiandingzhe 的回复:]

日,没改,应当是:
C/C++ code

BaseInfoArray* BaseInfoArray_new(int initial_size) {
BaseInfoArray* self = (BaseInfoArray*) malloc( sizeof(BaseInfoArray) );
self->content = (BaseInfo**) calloc( initial_s……
[/Quote]
jiandingzhe 2011-09-14
  • 打赏
  • 举报
回复
日,没改,应当是:

BaseInfoArray* BaseInfoArray_new(int initial_size) {
BaseInfoArray* self = (BaseInfoArray*) malloc( sizeof(BaseInfoArray) );
self->content = (BaseInfo**) calloc( initial_size, sizeof(void*) );
self->size = initial_size;
return self;
}


我怎么不能编辑自己帖子?!!!
jiandingzhe 2011-09-14
  • 打赏
  • 举报
回复
啊,上面有个错误,应当改成:

BaseInfoArray* BaseInfoArray_new(int initial_size) {
BaseInfoArray* self = (BaseInfoArray*) malloc( sizeof(BaseInfoArray) );
self->content = (BaseInfo**) calloc( initial_size, sizeof(void*) );
return self;
}


另外还有一些问题,比如对于一个指针容器,容器的尺寸和里面非空内容的尺寸不一定一样。
jiandingzhe 2011-09-14
  • 打赏
  • 举报
回复
如果你需要越界检查,你得自己定义一个容器类型,和一系列的访问函数,在访问函数里设置越界检查,并且只通过访问函数来访问容器。

另外,你的代码里提到了这样的访问方式:

BaseInfo_jl[i]->meterID

那么数组元素应当是BaseInfo的指针。
不过C不能简单地做到你想要的,因为C不能重载操作符,而C++可以。

于是:

typedef struct {
int size;
BaseInfo** content;
} BaseInfoArray;

// constructor
BaseInfoArray* BaseInfoArray_new(int initial_size) {
BaseInfoArray* self = (BaseInfoArray*) malloc( sizeof(BaseInfoArray) );
self->content = (BaseInfo**) calloc( initial_size, sizeof(void*) );
return self;
}

// destructor
void BaseInfoArray_free(BaseInfoArray* self) {
// 元素的释放也许不由容器负责,这里我们只释放容器。
free(self->content);
free(self);
}

// 访问时首先检查i是否越界,然后返回第i个元素。实现略。
BaseInfo* BaseInfoArray_get(int i);

// 如果i越界,重新分配内存,然后储存元素到i位置。实现略。
void BaseInfoArray_set(int i, BaseInfo* content);


如果你需要一个C语言里的可用的实现,可以看一下glib的容器。C++就直接用标准容器好了。
jason-xu 2011-09-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yaxiya 的回复:]
引用 5 楼 pathuang68 的回复:

引用 2 楼 yaxiya 的回复:

引用 1 楼 xin_wu_hen 的回复:

C/C++ code
LPBaseInfo BaseInfo_jl = (LPBaseInfo)malloc(sizeof(BaseInfo)*NUM);

测试:
strcpy(BaseInfo_jl[0]->meterID,"12");
……
[/Quote]
不报错很正常呀,虽然你引用了你申请的空间范围外的空间,但是如果这些空间没有用,或者不是一些非常关键的数据,也不是引起程序挂掉,但是你修改了这块空间的值是肯定的,有风险当不一定一用就马上报错
翻越寒武 2011-09-13
  • 打赏
  • 举报
回复
vc6下strcpy(BaseInfo_jl[0].meterID,"12");
可以运行
[Quote=引用 2 楼 yaxiya 的回复:]
引用 1 楼 xin_wu_hen 的回复:

C/C++ code
LPBaseInfo BaseInfo_jl = (LPBaseInfo)malloc(sizeof(BaseInfo)*NUM);

测试:
strcpy(BaseInfo_jl[0]->meterID,"12");
不正确;
[/Quote]
辰尘 2011-09-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wyl623623 的回复:]
LPBaseInfo *BaseInfo_jl = (LPBaseInfo *)Malloc(sizeof(LPBaseInfo)*m);
其中n是数组的大小,想要扩充,BaseInfo_jl = (LPBaseInfo *)realloc(BaseInfo_jl,sizeof(LPBaseInfo)*n);一定要m>=n,否则会造成数据丢失


数组大小动态的话可以用链表。
[/Quote]
不好意思,刚才上面写错了,应该是
BaseInfo*BaseInfo_jl = (BaseInfo*)Malloc(sizeof(BaseInfo)*m);
南之倩倩 2011-09-13
  • 打赏
  • 举报
回复
#define NUM 100 //数组的大小
int i;

LPBaseInfo BaseInfo_jl[NUM];
for(i=0;i<NUM;i++)
BaseInfo_jl[i] = (LPBaseInfo)malloc(sizeof(BaseInfo));


//直接定义数组来分配空间啊!
亚细亚 2011-09-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pathuang68 的回复:]

引用 2 楼 yaxiya 的回复:

引用 1 楼 xin_wu_hen 的回复:

C/C++ code
LPBaseInfo BaseInfo_jl = (LPBaseInfo)malloc(sizeof(BaseInfo)*NUM);

测试:
strcpy(BaseInfo_jl[0]->meterID,"12");
不正确;


1L给出的代码是正确的,楼主s……
[/Quote]
我测试:
LPBaseInfo BaseInfo_jl = (LPBaseInfo)malloc(sizeof(BaseInfo)*2);
strcpy(BaseInfo_jl[0].meterID,"12");
strcpy(BaseInfo_jl[1].meterID,"12");
strcpy(BaseInfo_jl[2].meterID,"12");
strcpy(BaseInfo_jl[3].meterID,"12");
发现编译运行也不报错!冥冥NUM等于2,为什么超出范围编译运行不报错?
pathuang68 2011-09-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yaxiya 的回复:]

引用 1 楼 xin_wu_hen 的回复:

C/C++ code
LPBaseInfo BaseInfo_jl = (LPBaseInfo)malloc(sizeof(BaseInfo)*NUM);

测试:
strcpy(BaseInfo_jl[0]->meterID,"12");
不正确;
[/Quote]

1L给出的代码是正确的,楼主strcpy(BaseInfo_jl[0]->meterID,"12");这样调用是错误的,应该这样:
strcpy(BaseInfo_jl->meterID,"12"); // 对于第一个元素
strcpy((BaseInfo_jl + 1)->meterID,"13"); // 对于第二个元素
afreet2006 2011-09-13
  • 打赏
  • 举报
回复
VS2008测试没有问题

int NUM = 4;
LPBaseInfo BaseInfo_jl = (LPBaseInfo)malloc(sizeof(BaseInfo)*NUM);
strcpy(BaseInfo_jl[0].meterID,"12");
辰尘 2011-09-13
  • 打赏
  • 举报
回复
LPBaseInfo *BaseInfo_jl = (LPBaseInfo *)Malloc(sizeof(LPBaseInfo)*m);
其中n是数组的大小,想要扩充,BaseInfo_jl = (LPBaseInfo *)realloc(BaseInfo_jl,sizeof(LPBaseInfo)*n);一定要m>=n,否则会造成数据丢失


数组大小动态的话可以用链表。

亚细亚 2011-09-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xin_wu_hen 的回复:]

C/C++ code
LPBaseInfo BaseInfo_jl = (LPBaseInfo)malloc(sizeof(BaseInfo)*NUM);
[/Quote]
测试:
strcpy(BaseInfo_jl[0]->meterID,"12");
不正确;
xin_wu_hen 2011-09-13
  • 打赏
  • 举报
回复
LPBaseInfo BaseInfo_jl = (LPBaseInfo)malloc(sizeof(BaseInfo)*NUM);

69,369

社区成员

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

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