嘿大家,我收到了一堆腐败错误,我无法弄明白。
char * c = (char *) malloc(1);
// main loop
_gcvt_s(c, 100, ball->get_X_Direction(), 10);
if(pushFont(c, (SCREEN_WIDTH - 30), (SCREEN_HEIGHT - 40), message, screen,
font, textColor) == false)
{
//return 1; // error rendering text.
}
// end main loop
free(c);
以上代码是我在_gcvt_s和pushFont()中使用c指针的唯一时间,它只接受char *作为其第一个参数,并将文本放在屏幕上。除此之外,我不使用c。当我尝试在主循环之后释放c(我认为我应该这样做)时,我得到一个错误,说Visual Studio已经获得了堆的错误(堆损坏)。
注释掉对pushFont的调用我仍然收到错误。
有人可以向我解释为什么释放一个字符(我在堆上分配的1个字节)会给我一个堆损坏吗?
最后我的主循环做了很多东西,一个伙伴和我正在用WinSocket做一个乒乓球游戏,主体的其余部分是游戏的循环。我不认为有必要发帖,但如果有必要,我会用整个主循环更新我的帖子,但我相信我对我对malloc()和free()的理解是对的。
全心全意,
答案 0 :(得分:9)
_gcvt_s不使用第二个参数作为分配缓冲区的最大大小?你分配1个字节,但告诉_gcvt_s有100个。所以它很高兴地将最多100个字节写入破坏你的堆的缓冲区。然后免费崩溃。如果要访问100个字节,则分配100个字节。
编辑:听起来你需要了解C如何存储和操作字符串。 C将字符串存储为连续内存中的单个字节,后跟一个额外字符以指示字符串的结尾。此额外字符的ASCII值为0(不是字符'0',即ASCII 48)。因此,如果您有一个像“HELLO”这样的字符串,则需要存储6个字节 - 一个用于5个字母和终止符。为了让_gcvt_s()将值返回到缓冲区,您需要为转换和额外的终止字节包含足够的字节。在_gcvt_s()的情况下,您要求10个字符的精度。但是你还必须保留小数点的空间,潜在的负号。
根据这个[文档](http://msdn.microsoft.com/en-us/library/a2a85fh5(VS.80).aspx),标题中有一个#define,用于缓冲区的最大必要大小:_CVTBUFSIZE。这个例子可以帮助你解决这个问题。
答案 1 :(得分:4)
根据文档,我可以发现_gcvt_s()
将缓冲区和缓冲区的长度作为前两个参数。
errno_t _gcvt_s(
char *buffer,
size_t sizeInBytes,
double value,
int digits
);
您的malloc()
ed缓冲区长度为1个字节,您告诉_gcvt_s()
它长度为100个字节。我会开始看这里。
答案 2 :(得分:3)
为什么需要使用堆?如果您只需要1个字符的空间,则不能只使用局部变量:
char c;
_gcvt_s(&c...
答案 3 :(得分:1)
您需要多个字节来存储浮点数。分配比1字节更实用的长度......
你也真的不需要堆,尝试一个(略微过大的)16字节缓冲区并给_gcvt_s正确的缓冲区长度(而不是你给它的神奇的100)。当你在它的时候去除你的常数。
const unsigned int cuFloatStringLength = 16;
const unsigned int cuFloatStringPrecision = 10;
char c[cuFloatStringLength];
_gcvt_s( c, cuFloatStringLength, ball->get_X_Direction(), cuFloatStringPrecision );
问题应该消失。