c语言链表申请空间,[C语言]如何防止链表内多申请空间的“浪费”?如何让字串动态申请空间?...

本文讨论了在C语言中使用结构体存储数据时遇到的空间浪费问题,特别是当结构体中固定长度的字符串字段不足以容纳实际数据时。作者提出了动态分配内存的需求,并询问如何在写入二进制文件时解决这个问题。同时,他还引入了一个分隔标识用于区分二进制文件中的数据块,但担心动态写入后如何在读取时正确识别这些分隔符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我是C语言入门菜鸟一只

比如我有一个结构体,里面保存着整型的ID和50个字符长度的名字,但是将记录写入到二进制文件的时候,这些没有被使用的空间也会以00的方式补充进来,也就是我所谓的“空间的浪费”。

bVTxXl?w=480&h=180

我的代码(微长)如下:

#include

#include

#include

#include

typedef struct NODE{

int id;

char name[50];

struct NODE *next;

}NODE;

NODE *create_node(){

return calloc(1,sizeof(NODE));

}

void setup_values(NODE *node){

int id;

char name[50];

scanf("%d %s",&id,name);

node->id = id;

strcpy(node->name,name);

}

void append(NODE *HEAD){

NODE *tmp = HEAD;

while(tmp->next){

tmp = tmp->next;

}

tmp->next = create_node();

setup_values(tmp->next);

}

void clean_all(NODE *HEAD){

NODE *target,*t_next;

target = HEAD->next;

while(target->next){

t_next = target->next;

free(target);

target = t_next;

}

free(target);

free(HEAD);

}

void write_bin_file(NODE *HEAD, const char *FILE_NAME){

NODE *tmp = HEAD->next;

int SPLIT_MARK = 0xFF2277FF;

FILE *fp = fopen(FILE_NAME,"wb");

while(tmp){

fwrite(&tmp->id,sizeof(int),1,fp);

fwrite(tmp->name,sizeof(tmp->name),1,fp);

tmp = tmp->next;

fwrite(&SPLIT_MARK,sizeof(int),1,fp);

}

fclose(fp);

}

int main(void)

{

NODE *head = create_node();

append(head);

append(head);

write_bin_file(head,"d:\\abc.bin");

clean_all(head);

return 0;

}

毕竟结构体中name是申请了50个字符,所以没有占用的地方也都被fwrite写进去了。但是如果遇到名字很长比如……

阿里斯基奈何路马里亚蒙娜埃德斯基卢法斯纳贝尔弗兰德歌德尔安纳克洛斯灰粽

那么50个字符的空间就肯定不够用了……

所以,如何修改char name[50]以让它能动态的申请到空间呢?

另外,我在代码中的这句

int SPLIT_MARK = 0xFF2277FF;

是希望能通过FF2277FF来做每组数据的分隔标识……可是如果实现了“动态”写入二进制文件,那么读取的时候又该如何通过fread识别呢?

请详细指教,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值