某些函数中的修改结构会更改指针并导致free()失败

时间:2015-10-12 03:20:38

标签: c function pointers struct memory-address

请原谅我在一行上运行多个陈述,但这是我不明白的。我有三个函数,分别是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;}

1 个答案:

答案 0 :(得分:1)

简单解决方案:不要通过引用传递

test "should update post" do
  assert_difference('Post.count') do
    put :update, update_query_parameters
  end

  assert_redirected_to post_path(assigns(:post))
end

如果您确实希望通过引用传递但不希望引用的对象发生更改(这与通过引用传递的通常原因相反),那么请复制引用的对象:

void makeblock(block* data){
    data->a=1; data->b='A'; data++;
    data->a=2; data->b='B'; data++;
}