Closed. This question is off-topic。它当前不接受答案。
想改善这个问题吗? Update the question,因此它是on-topic,用于堆栈溢出。
3年前关闭。
我有个问题
该方法可以正常工作,它返回具有正确NaME值的结构
否则这不起作用,
第二个问题是:name不包含正确的值,
请解释为什么。
您只能为一个指针分配足够的空间,而不是为其指向的空间。结果,当您分配给
这种混淆是避免将指针性质隐藏在typedef后面的一个好理由。但是,这样做可以避免显式引用typedef后面的实际类型,如下所示:
在任何情况下,这都是一个很好的模式,因为它可以抵抗指向类型的更改。
由于在两种情况下您都具有未定义的行为,因此推测实际发生的事情是没有意义的,因为从语言的角度出发,推测是我们所能做的。这就是“未定义”的意思。
另外,正如其他人所观察到的,
想改善这个问题吗? 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