指针内存分配!!求高手现身。
针对:
struct blocked_ip {
char ip[16];
struct blocked_ip* next;
};
以下三种方法,分别错误在什么地方:
写法1:
struct blocked_ip *bip;
bip = malloc(sizeof(struct blocked_ip));
bzero(bip->ip, 16);
bip->next = NULL;
写法2:
struct blocked_ip *bip=(struct blocked_ip *)calloc(1,sizeof(struct blocked_ip *));
*bip = malloc(sizeof(struct blocked_ip));
bzero(bip->ip, 16);
bip->next = NULL;
写法3:
struct blocked_ip* bip = (struct blocked_ip*) malloc(sizeof(struct blocked_ip*));
bip->ip = (char *) calloc(1,16);
bip->next = NULL;
[解决办法]
写法1:少了指针的强制(struct blocked_ip *)转换
写法2:重复分配会造成内存泄露
写法3:ip是数组,已经分配空间,不需要再动态分配
//1 没有别人的语法错误!稍微修改
struct blocked_ip *bip;
bip = (struct blocked_ip *)malloc(sizeof(struct blocked_ip));
memset(bip, 0 ,sizeof(struct blocked_ip));
bzero(bip->ip, 16);
bip->next = NULL;
//2 calloc和malloc不同点就是会对分配的内存初始化而已!
//你先分配了内存没有释放,然后对它取值,然后在分配内存直接是错误的做法!不合语法
//如果是要双指针的话,可以如下操作
struct blocked_ip **bip=(struct blocked_ip **)calloc(1,sizeof(struct blocked_ip *));
*bip = (struct blocked_ip *)malloc(sizeof(struct blocked_ip)); //这里只是分配一个结构体内存空间而已
memset(bip, 0 ,sizeof(struct blocked_ip));
bzero(bip->ip, 16);
bip->next = NULL;
//3 ip已经是数组,当你给bip分配内存空件的时候,就已经给它分配了的!
//所以不需要再额外分配内存空间
//如果是 char *p ,则需要再额外分配