Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,因此它是on-topic,用于堆栈溢出。
                        
                        3年前关闭。
                                                                                            
                
        
我有个问题
该方法可以正常工作,它返回具有正确NaME值的结构

prodotti creaProdotto(char *name, float price, prodotti next){
    prodotti p = malloc(sizeof(prodotti));
    p->name = malloc(30 * sizeof(char));
    p->name = strdup( name);
    p->price = price;
    p->next = next;
    return p;
}


否则这不起作用,

prodotti creaProdotto(char *name, float price, prodotti next){
    prodotti p = malloc(sizeof(prodotti));
    p->name = malloc(30 * sizeof(char));
    strcpy(p->name, name);
    p->price = price;
    p->next = next;
    return p;
}


第二个问题是:name不包含正确的值,
请解释为什么。

最佳答案

假设prodotti被类型定义为指针类型,则这有一个基本问题(在两种情况下):

    prodotti p = malloc(sizeof(prodotti));


您只能为一个指针分配足够的空间,而不是为其指向的空间。结果,当您分配给*p的成员时,您将调用未定义的行为,该成员的推定存储距离对象的开头比指针的大小更远。

这种混淆是避免将指针性质隐藏在typedef后面的一个好理由。但是,这样做可以避免显式引用typedef后面的实际类型,如下所示:

    prodotti p = malloc(sizeof(*p));


在任何情况下,这都是一个很好的模式,因为它可以抵抗指向类型的更改。

由于在两种情况下您都具有未定义的行为,因此推测实际发生的事情是没有意义的,因为从语言的角度出发,推测是我们所能做的。这就是“未定义”的意思。

另外,正如其他人所观察到的,malloc()p->name内存然后用strdup()的结果覆盖结果指针比没有意义的要糟。然后,您不仅分配了超出您需要的内存,还泄漏了通过malloc()获得的内存。似乎strdup()本身,如果没有前面的malloc(),将是一种合理的方法。

关于c - 使用strdup()或strcpy()进行澄清,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36813503/

10-12 14:47