C 将指针返回到float会在到达main函数时更改地址

C 将指针返回到float会在到达main函数时更改地址,c,pointers,C,Pointers,主要方法 int x, y; printf("Please enter 2 integers separated by a space: "); scanf("%d %d", &x, &y); 其他方法。这是从主函数调用的矩阵_get函数的一部分 if (key_comp (key, node->key) == 0){ data_print(node->data); 某些头文件 typedef float Data_Item; 好

主要方法

 int x, y;
    printf("Please enter 2 integers separated by a space: ");
    scanf("%d %d", &x, &y);
其他方法。这是从主函数调用的矩阵_get函数的一部分

if (key_comp (key, node->key) == 0){
       data_print(node->data);
某些头文件

typedef float Data_Item;
好的,当我返回指向Data_项的指针(它是一个float typedef)时,它的地址会改变,因此当我在main方法中取消引用它时,它会变为null。为什么?

printf("%d", &pdata);
应该是

printf("%f", *pdata);
您试图打印指针的地址,而不是指针的值。试图用
%d
打印地址未定义。对浮动使用
%f
。使用

为指针分配的内存会泄漏,因为指针的值被局部变量的地址覆盖。相反,您应该将局部变量中的数据复制到为指针分配的内存中

*pdata = node->data;
线路

   pdata=&(node->data);
更改
pdata
的值。它现在与
malloc
返回的值不同。您已经注释掉的更合理的一行是:

   //*pdata=node->data;
在第一行中,您将
pdata
指定为
节点->数据的地址。在注释掉的行中,您试图通过
node->data
设置
pdata
指向的值

您缺少来自两个分支的
返回值

改变

if(key_comp (key, node->key) == -1){
      bs_tree_search_h(node->left, key);
}else if(key_comp (key, node->key) == 1){
      bs_tree_search_h(node->right, key);
}


嗯,我只是在打印pdata的地址,看看它是否发生了变化(确实发生了变化)。printf函数与任何事情都无关,它只是用于调试目的。当我将助手函数的pdata地址返回到主函数时,它的地址发生了变化。所以当我将其更改为您所说的内容时,程序现在崩溃了。我想这是因为*pdata是未定义的?因为那个指针什么都不指向..该是你使用调试器的时候了!当我用注释掉的行替换上面的行时,它仍然崩溃。知道为什么吗?我从你发布的代码中看不到任何东西。可能是
matrix\u get
从其他地方返回。抱歉,我用了更多内容编辑了我的线程。我只是有点害怕我的老师会认为我偷了代码,然后给我一个0.::(
bs_tree\u search\u h
的最后一行返回
NULL
。有可能是你碰到了那一行。我可以保证它没有碰到那一行,我已经测试过它是否用指针碰到了bs_tree\u search\h的return语句。不过我不确定我写的矩阵函数是否正确?
if(key_comp (key, node->key) == -1){
      return bs_tree_search_h(node->left, key);
}else if(key_comp (key, node->key) == 1){
      return bs_tree_search_h(node->right, key);
}