我有
给出的结构Node
和Box
typedef struct Node{
Particle p;
Box box;
struct Node *son[4];
}Node
和
typedef struct Box{
double low[3];
double up[3];
}Box
我有两个函数insert()
和sonumb()
我希望使用这些结构。
void insert(Particle *p, Node *t){
Box sonbox;
int b=sonumb(&t->box, &sonbox, p);
t->son[b]->box = sonbox; // <--- Produces Segmentation fault (core dumped)
}
int sonumb(Box *box, Box *sonbox, Particle *p){
int b=0;
for(int d=0;d<3;d++){
sonbox->up[d] = 0.5*box->up[d];
sonbox->low[d] = 0.5*box->low[d];
}
b=1; // b=[0,3] just for this example
}
sonum()
返回整数值b
。 sonbox
代表sonumb()
内t->box
个较小的方框后,代表sonbox
。我在通话结束后返回sonbox
的正确值。所以t->son[b]->box = sonbox
不是空的。但是,如果我想复制像Dim param As New Specialized.NameValueCollection
param.Add("STARTDATE", "2017-01-1 0:0:0")
Dim response As String = getNVP("TransactionSearch", param)
Private Function getNVP(ByVal method As String, Optional ByVal param As Specialized.NameValueCollection = Nothing) As String
If param Is Nothing Then param = New Specialized.NameValueCollection
Using client As New Net.WebClient
param.Add("METHOD", method)
param.Add("USER", APIuser)
param.Add("PWD", APIpass)
param.Add("SIGNATURE", APIsign)
param.Add("VERSION", "204")
Dim rbytes = client.UploadValues("https://api-3t.paypal.com/nvp", "POST", param)
Return Uri.UnescapeDataString((New System.Text.UTF8Encoding).GetString(rbytes))
End Using
End Function
这样的值,我会得到一个段错误。我错过了什么?
答案 0 :(得分:1)
您几乎肯定错过了son
元素的分配。为了使表达式t->son[b]->box
生成赋值的有效目标,需要为t->son[b]
分配指向有效Node
结构的指针。指针需要指向您之前分配的某些Node
。
如果节点之间共享子节点,则应该是malloc
个节点。这增加了相当多的复杂性,因为删除共享节点并非易事。使用共享节点的两种常用方法是(1)在大型数组中一次性分配所有节点,并在需要时逐个使用它们,以及(2)向struct
添加引用计数,在获取指针时递增它,并在不再需要引用时递减它。第二种方法极难实施;看看你是否可以在承诺之前避免它。
另一方面,如果子节点完全由其父节点拥有,那么您有一个非常简单的解决方案:在分配Node
元素之前分配malloc
son[b]
,{当你完成节点时,{1}}他们:
free
使用Box sonbox;
int b=sonumb(&t->box, &sonbox, p);
t->son[b] = calloc(1, sizeof(Node)); // Allocate the node
t->son[b]->box = sonbox;
可确保在进行其他分配之前清除calloc
的内存。如果没有必要,因为您在功能的其余部分中分配了所有成员,请将呼叫替换为Node
:
malloc
答案 1 :(得分:0)
添加@ dasblinkenlight的评论。
Box sonbox; ---> This variable is on stack
int b=sonumb(&t->box, &sonbox, p); --> content of t->box is COPIED to sonbox, not by reference but by value.
t->son[b]->box = sonbox; // --> Assigning stack variable is incorrect, because it will vanish once you exit function. OR as @dasblinkenlight suggested pass the value but not the pointer.