【发布时间】:2015-10-28 14:22:59
【问题描述】:
有人可以帮我理解以下行为吗:
我有一段用于克隆浮动图像的代码。
Clone 方法将指向另一个图像的指针及其尺寸作为参数。
一切正常,但有时clone[i] = color; 这一行会导致访问冲突。异常的发生是不可预测的,也不是周期性的。在崩溃时检查变量表明Color color = source[i]; 始终设置且有效。
malloc 怎么可能返回一个错误的指针?
代码:
typedef struct
{
float r;
float g;
float b;
float a;
} Color;
Color* Clone(Color* source, int width, int height)
{
int s = width * height;
Color *clone;
clone = (Color *)malloc(s * sizeof(Color));
if (clone)
{
for (int i = 0; i < s; i++)
{
Color color = source[i];
// Sometimes app crash here: Access violation
clone[i] = color;
}
}
return clone;
}
非常感谢任何帮助。
更新:
平台:Windows 64 位
崩溃时变量的值:
width = 256
height = 256
s = 655536
i = 0
【问题讨论】:
-
从不投射
malloc的结果 -
很可能,在您的程序中的某个地方存在导致堆损坏的东西,进而破坏了使用堆的程序的其他部分。
-
但是FFS,请停止抱怨关于强制转换malloc。我敢肯定,每个该死的 C 问题的评论部分都有更重要的事情要讨论。
-
@Chris Dead horse malloc cast debate can be found here。现在,请大家不要再用这些无关紧要的、离题的言论向这个问题发送垃圾邮件了吗?
-
@KeylorSanchez:实际上,如果我们使用全语言 C 结构赋值是正确的做法。 memcpy 对整个结构进行平面的、无效的复制,但根据 C 语言标准,实际上只定义了对实际结构元素的访问。根据编译器填充结构的方式,memcpy 还将在元素“之间”读/写,也就是说,如果我们是超技术且完全强迫症,则非法和未定义的行为。
标签: c malloc access-violation