我在某些网站上看到了与realloc()相关的一些代码,如下所示。
int *p = (int *)malloc(sizeof(int) * 10);
p = (int *)realloc(p, 100);
但正如标准所说,如果realloc失败,原始块保持不变并返回NULL。
因此,如果realloc失败,从上面的例子中,我们将失去释放p的能力。任何人都可以让我知道将realloc()返回的地址分配给同一个指针是不是很好的编码实践?
答案 0 :(得分:5)
你是正确的,直接将SELECT
U.*,
SUM(P.cost) AS spent
FROM `#__users` AS U
LEFT JOIN `#__projects` AS P ON P.client_id = U.id
GROUP BY U.id
HAVING (SUM(P.cost) >= 1000 AND SUM(P.cost) < 2000)
ORDER BY U.user_creation_timestamp DESC LIMIT 25 OFFSET 0;
的返回值分配给你唯一的原始指针副本是不好的做法。如果realloc
失败,你不仅会失去free
内存的能力(我会称之为较小的问题);您还丢失指针所指向的数据。
对于某些程序而言,这可能并不重要(例如,如果您只是要终止并中止分配失败的整个操作,这可能是也可能不是可接受的做法,而且这本身就是一个完整的主题)但是通常,您需要先将realloc
的结果存储到单独的临时变量中,并在检查成功后才覆盖原始指针变量。
答案 1 :(得分:2)
R上。对你的问题给出了明确的答案。让我强调代码片段中的另外两个问题:
self.checkBall.frame.origin.x = self.view.bounds.width/2 - self.checkBall.frame.width/2 + 70
self.checkBall.frame.origin.y = self.view.bounds.height/2 - self.checkBall.frame.height/2 - 70
在C中,大多数人认为将int *p = (int *)malloc(sizeof(int) * 10);
p = (int *)realloc(p, 100);
,malloc()
和calloc()
的返回值转换为不良做法。 realloc()
返回值将自动转换为适当的指针类型,除非代码编译为C ++代码,这是C语言的疏远表。
更重要的是,void *
指向硬编码大小realloc
的指针没有意义。在重新分配的阵列中可以访问的100
的数量取决于int
类型的实际大小,该大小可能因系统而异。实际上,在某些体系结构中,int
甚至不是100
的倍数。作者可能打算写sizeof(int)
或p = realloc(p, sizeof(int) * 100);
,并且片段周围的更多上下文可以帮助理解意图......正如所写,由于多种原因,它很可能是一个错误。