函数外部的值与函数C内部不匹配

时间:2013-12-10 10:59:32

标签: c function pointers structure push

拜托,我遇到了问题,我需要帮助。

获得struct(stack):

struct sAddress {
    tBSTNodePtr *data;
    struct sAddress *pointer_next;
}*ads_stack;

然后我有PUSH功能

void pushAds(tBSTNodePtr hodnota)
{
    struct sAddress *temp;
    temp = (struct sAddress*)malloc(sizeof(struct sAddress));
    temp->data = &hodnota;
    if (ads_stack == NULL) {
        ads_stack = temp;
        ads_stack->pointer_next = NULL;
    }
    else {
        temp->pointer_next = ads_stack;
        ads_stack = temp;
    }
    printf("PUSH ADS KEY: %s\n", ads_stack->data->Key->str);
}

当我推送某物(在tBSTNodePtr中)时,它会正确打印Key->str的值。但是当我尝试在函数之外打印相同的函数时,这样:

printf("STACK DATA: %s\n", ads_stack->data->Key->str);

它会给我segfault(在代码块下使用Win 8.1,在使用makefile的Fedora下试用)。我做错了什么?指针错了吗?推送功能外ads_stack不是NULL。

2 个答案:

答案 0 :(得分:4)

问题在于

temp->data = &hodnota;

引用局部变量hodnota的地址(这是收到的param)。

你能解释一下tBSTNodePtr是什么吗?

temp->datatBSTNodePtr *,在您的函数中,您会收到tBSTNodePtr,而不是tBSTNodePtr *。如果您使用&hodnota,您将引用本地参数的地址,当您离开您的函数时,它超出范围,该变量不再存在。

你应该:

  • 将指针传递给tBSTNodePtr
  • 在您的功能
  • 中创建hodnota的副本

但也许这一切都取决于tBSTNodePtr是什么,如果它是指向BSTNode的指针,那么可能你应该改变其他东西。可能更改结构删除数据中的*并将temp->data = &hodnota;更改为temp->data = hodnota;

作为旁注:

temp = (struct sAddress*)malloc(sizeof(struct sAddress));

在{C}中强制转换为struct sAddress *。您可以避免使用它。也许是这样的:

temp = malloc(sizeof *temp);

看起来更好。

答案 1 :(得分:0)

void pushAds(tBSTNodePtr hodnota)替换为void pushAds(tBSTNodePtr *hodnota) 如果您想使用hodnota struct读取主函数中的参数

但如果您想更改hodnota struct,则必须使用void pushAds(tBSTNodePtr **hodnota) 然后将temp->data = &hodnota;替换为temp->data = *hodnota;