前述
在我的上一篇文章《利用宏實(shí)現(xiàn)C語(yǔ)言任意類型的安全數(shù)組》中留下的代碼,經(jīng)過(guò)我反復(fù)品味,發(fā)現(xiàn)還有一些不足,例如:
- Create_Array 宏的模塊化程度不高,有比較重的散裝感,也就是耦合度高。
- Destroy_Array 宏沒有對(duì)于情況的仔細(xì)分析處理分支,不安全。
- 原Array 結(jié)構(gòu)體不應(yīng)該別稱為Array ,它更像是一種通用的安全結(jié)構(gòu)。
- 命名上的不規(guī)范,不能達(dá)到顯而易見的效果。
改進(jìn)
針對(duì)以上不足,做出如下改進(jìn):
- 規(guī)范了命名,使得通過(guò)名字就能確定所屬關(guān)系和類型。
- 抽象出一個(gè)通用的 Box 結(jié)構(gòu),避免歧義。
- 使用單個(gè)函數(shù)封裝了創(chuàng)建 Box 結(jié)構(gòu)的功能,模塊化成度更高。
- 簡(jiǎn)化宏的結(jié)構(gòu),為宏添加必要的處理分支。
- 添加了必要的注釋,方便閱讀。
代碼:
#include<stdio.h>
#include<stdlib.h>
// 可以通用的 內(nèi)容+大小 結(jié)構(gòu)
typedef struct {
size_t size;
void *private;
}Box;
// 創(chuàng)建一個(gè)Box對(duì)象,并為私有成員開辟需要的空間
Box *Box_new(size_t size, size_t typesize) {
Box *out = calloc(1, sizeof(Box));
if (out != NULL) {
out->private = calloc(size,typesize);
if (out->private != NULL) {
out->size = size;
return out;
}
else {
free(out);
out=NULL;
}
}
return out;
}
// 釋放分配的空間
void Box_delete(Box *opj){
if(opj->private != NULL) {
free(opj->private);
}
free(opj);
}
/** if 分配成功
* 生成兩個(gè)指針
* 一個(gè)指向結(jié)構(gòu)
* 一個(gè)具象化的類型指針,指向結(jié)構(gòu)中的私有成員
* else 兩個(gè)堆內(nèi)存,任意一個(gè)分配失敗
* 生成兩個(gè)空指針
*/
#define Box_get_as_type(name, type) \
type *name##_ptr = NULL; \
if(name != NULL) { name##_ptr = name->private; } \
#define Box_create(name, type, length) \
Box *name = Box_new(length, sizeof(type)); \
/** if 數(shù)組指針不為空
* 分配的內(nèi)存,遵循由內(nèi)部向外部逐步釋放原則
* 優(yōu)先把 private 的別名指針置空
* 清理結(jié)構(gòu)體內(nèi)部動(dòng)態(tài)內(nèi)存
* 清理結(jié)構(gòu)體動(dòng)態(tài)內(nèi)存
*/
#define Box_destory(name) \
if(name) { \
Box_delete(name); \
name=NULL; \
}
void fn(int *opj, size_t size){
for(int i=0; i < size; i++) {
opj[i]=i*2;
if(i < size-1) printf("%d->",opj[i]);
else printf("%d\n總數(shù):%zu 個(gè)\n",opj[i],size);
}
}
int main(){
Box_create(an, int, 10)
Box_get_as_type(an, int)
if(an) fn(an_ptr, an->size);
Box_destory(an)
}
結(jié)果:
Safe_Power
疑問(wèn):
在之前印象里,free函數(shù)只是釋放了這個(gè)指針指向的地址,指針值應(yīng)該不變,但是在這里,結(jié)構(gòu)體中 private 指針釋放后,值發(fā)生變化,而結(jié)構(gòu)體指針的值卻不變的?!都是calloc分配的,怎么會(huì)有詭異的現(xiàn)象?雖然不耽誤啥,但就是想不通。
注意
文章為本人在簡(jiǎn)書平臺(tái)原創(chuàng),盜用必究!