某些函数中的修改结构更改指针并导致 free() 失败
Modified struct in some functions changes pointer and causes free() to fail
请原谅我在一行中 运行 多个语句,但这是我不明白的地方。我有三个名为 function1、function2 和 function3 的函数,每个函数分别调用 makeblock、makeblock2 和 makeblock3。请参阅下面的代码。我试图让它们在屏幕上产生相同的结果。 makeblock函数运行正常,调用function1后结果为:
1 A
2 B
function2 和 function3 在尝试释放内存指针时无法正常工作并产生分段错误。我怀疑这与分别在 makeblock2 和 makeblock3 函数中处理指针的方式有关。
所以基本上,我正在寻找一种使数据可访问的快捷方式,而无需将修改后的地址值返回给调用者。比 block* dat=*datain;block** data=&dat;
短的东西是理想的,只要它有效但我在 makeblock2 和 makeblock3 中的尝试都失败了。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct{int a;char b;} block;
void printdata(block* data){
while(data->a != 0){printf("%d %c\n",data->a,data->b);data++;}
}
void makeblock3(block** datain){
block** data=&(*datain);
(**data).a=1;(**data).b='A';(*data)++;
(**data).a=2;(**data).b='B';(*data)++;
}
void makeblock2(block** datain){
block** data=datain;
(**data).a=1;(**data).b='A';(*data)++;
(**data).a=2;(**data).b='B';(*data)++;
}
void makeblock(block** datain){
block* dat=*datain;block** data=&dat;
(**data).a=1;(**data).b='A';(*data)++;
(**data).a=2;(**data).b='B';(*data)++;
}
void function1(){block* data=calloc(1,100000);makeblock(&data);printdata(data);free(data);}
void function3(){block* data=calloc(1,100000);makeblock3(&data);printdata(data);free(data);}
void function2(){block* data=calloc(1,100000);makeblock2(&data);printdata(data);free(data);}
int main(){function3();return 0;}
简单的解决方案:不要通过引用传递
void makeblock(block* data){
data->a=1; data->b='A'; data++;
data->a=2; data->b='B'; data++;
}
如果你真的想通过引用传递但不希望被引用的对象发生变化(这与通过引用传递的通常原因相反),那么复制一个被引用的对象:
void makeblock(block** data_p){
block* data = *data_p;
data->a=1; data->b='A'; data++;
data->a=2; data->b='B'; data++;
}
请原谅我在一行中 运行 多个语句,但这是我不明白的地方。我有三个名为 function1、function2 和 function3 的函数,每个函数分别调用 makeblock、makeblock2 和 makeblock3。请参阅下面的代码。我试图让它们在屏幕上产生相同的结果。 makeblock函数运行正常,调用function1后结果为:
1 A
2 B
function2 和 function3 在尝试释放内存指针时无法正常工作并产生分段错误。我怀疑这与分别在 makeblock2 和 makeblock3 函数中处理指针的方式有关。
所以基本上,我正在寻找一种使数据可访问的快捷方式,而无需将修改后的地址值返回给调用者。比 block* dat=*datain;block** data=&dat;
短的东西是理想的,只要它有效但我在 makeblock2 和 makeblock3 中的尝试都失败了。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct{int a;char b;} block;
void printdata(block* data){
while(data->a != 0){printf("%d %c\n",data->a,data->b);data++;}
}
void makeblock3(block** datain){
block** data=&(*datain);
(**data).a=1;(**data).b='A';(*data)++;
(**data).a=2;(**data).b='B';(*data)++;
}
void makeblock2(block** datain){
block** data=datain;
(**data).a=1;(**data).b='A';(*data)++;
(**data).a=2;(**data).b='B';(*data)++;
}
void makeblock(block** datain){
block* dat=*datain;block** data=&dat;
(**data).a=1;(**data).b='A';(*data)++;
(**data).a=2;(**data).b='B';(*data)++;
}
void function1(){block* data=calloc(1,100000);makeblock(&data);printdata(data);free(data);}
void function3(){block* data=calloc(1,100000);makeblock3(&data);printdata(data);free(data);}
void function2(){block* data=calloc(1,100000);makeblock2(&data);printdata(data);free(data);}
int main(){function3();return 0;}
简单的解决方案:不要通过引用传递
void makeblock(block* data){
data->a=1; data->b='A'; data++;
data->a=2; data->b='B'; data++;
}
如果你真的想通过引用传递但不希望被引用的对象发生变化(这与通过引用传递的通常原因相反),那么复制一个被引用的对象:
void makeblock(block** data_p){
block* data = *data_p;
data->a=1; data->b='A'; data++;
data->a=2; data->b='B'; data++;
}