复制结构

时间:2017-02-19 12:20:27

标签: c pointers struct

我有

给出的结构NodeBox
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()返回整数值bsonbox代表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 这样的值,我会得到一个段错误。我错过了什么?

2 个答案:

答案 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.