结论在最后,可直接看最后。
工作中遇到了一个这样的问题。
需要在 一个结构体后面 绑定一个变量,但不能对原结构体进行修改。
比如说:
Struct ss{
Int a;
Char b;
Float c;
};
在这个结构体内部不变的情况下,需要在其后绑定一个 double d的变量。API的入口参数不变,要求在API内部进行绑定。
我最开始的思路是:
这个问题需要考虑的是,要在原结构体的尾部,增加字节,以便绑定信息。所以,很容易就想到mallo和realloc。最后选用malloc。先分配足够大小的动态内存,然后将得到的地址指向原结构体。紧接着偏移sizeof(原结构体)的大小,赋值d。这样就拼接成了一个新的结构体。
很快就完成了这个函数的更改,测试通过。
报告上司,很快过来查看代码。看看了,问我:“malloc是干嘛的?”我:“啊?动态内存分配啊” 问:“你知道什么时候采用动态内存分配么?”我:“额,。。。。。。”。老大说:“动态内存分配,肯定是变长的时候使用。咱们现在这个改动属于固定长度,所以,动态内存分配不是最好的一种选择。” “那,,用数组?”我脱口而出道。 老大看了看我说:“对。并且为了代码可读性,你应该在定义一个结构体,比之前结构体多一个变量定义。然后,直接对其赋值就ok了,这样,后面维护的人看到你的代码也会更清晰明白。”我若有所思的点了点头,说:“立马就修改!”
所以,动态内存和数组的选用,很好理解。
1:当变量长度是变长的时候,最好使用动态内存分配。
否则,用数组申请,小了,不够用。大了,浪费空间。
2:当变量长度是定长的时候,最好使用数组来申请连续空间的内存。
动态内存也可以,但会浪费堆栈资源,效率没有数组高。