C语言指针的浅拷贝与深拷贝
记录在学习过程中遇到的问题
CSE123 Computer Networks
在发送接收端时,发现有segmentation fault。成因是在进行I/O时,把charbuf释放了,导致buffer list里的内容也被释放了。
归根结底是指针的拷贝问题。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct LLnode_t {
struct LLnode_t* prev;
struct LLnode_t* next;
void* value;
};
typedef struct LLnode_t LLnode;
struct LLnode1 {
int a;
};
typedef struct LLnode1 LLnode1;
int main(int argc, char *argv[]) {
LLnode * test = malloc(sizeof(LLnode));
LLnode1 * content = malloc(sizeof(LLnode1));
content->a = 1;
test->value = content;
printf("%d\n", content->a);
LLnode1 * copy = (LLnode1*) test->value;
// LLnode1 * copy = malloc(sizeof(LLnode1));
// memcpy(copy, (LLnode1*) test->value, sizeof(LLnode1));
printf("%d\n", copy->a);
free(copy);
printf("错了,正常应该是1\n");
printf("%d\n", content->a);
free(test->value);
//free(test);
}
输出
1
1
错了,正常应该是1
2117402640
Terminated due to signal: ABORT TRAP (6)
因为我们在想象copy赋值的时候其实只是拷贝了地址,所以当copy被释放时,原内存也被释放了
LLnode1 * copy = malloc(sizeof(LLnode1));
memcpy(copy, (LLnode1*) test->value, sizeof(LLnode1));
换为这样才对