拜托,我遇到了问题,我需要帮助。
获得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。
答案 0 :(得分:4)
问题在于
temp->data = &hodnota;
引用局部变量hodnota的地址(这是收到的param)。
你能解释一下tBSTNodePtr是什么吗?
temp->data
是tBSTNodePtr *
,在您的函数中,您会收到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;