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

标签 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;}

最佳答案

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

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++;
}

关于c - 某些函数中修改的结构会更改指针并导致 free() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33072775/

相关文章:

c - 将指针分配给C中的枚举变量时出现问题

c++ - C 和 C++ 编译器何时隐式地将 float 转换或提升为 double ?

python - 有什么方法可以将函数存储在变量中并创建变量容纳函数的列表吗?

r - 仅当环境中存在变量时,如何在 R 中运行 block ?否则跳到下一个 block

c++ - 为什么指针不能转换为引用?

c - 指向空数组的指针

c - C语言的有限状态机编译器模拟网络协议(protocol)

c++ - 如何在不使用命名空间 std 和字符串库的情况下拆分和存储 const char*?

c - Valgrind 不显示行号

C - 在函数中使用 fgets() 从标准输入读取行