返回char指针的C函数将垃圾放入;“调试”;模式,但不在“中”;“释放”;模式
只需编写一个简单的C程序来读取一个长的二进制文件,将其分成12位的块,并附加4位CRC,然后输出到另一个文件。当我在调试模式(VisualStudio2012)下运行代码时,它会返回垃圾,但一旦切换到发布模式,它就会正常工作 切换回调试模式似乎也不会带来问题。。。只是想了解这里发生了什么。无论VS使用“发布模式”做什么,代码都可以在那里工作,但是当我使用Dev-C++进行编译时,我总是得到与调试模式相同的垃圾 编辑:我已经建议在calc函数中使用malloc,并在main中使用free,但是我仍然得到垃圾输出。VS实际上在运行时崩溃返回char指针的C函数将垃圾放入;“调试”;模式,但不在“中”;“释放”;模式,c,visual-studio-2012,visual-studio-debugging,release-mode,C,Visual Studio 2012,Visual Studio Debugging,Release Mode,只需编写一个简单的C程序来读取一个长的二进制文件,将其分成12位的块,并附加4位CRC,然后输出到另一个文件。当我在调试模式(VisualStudio2012)下运行代码时,它会返回垃圾,但一旦切换到发布模式,它就会正常工作 切换回调试模式似乎也不会带来问题。。。只是想了解这里发生了什么。无论VS使用“发布模式”做什么,代码都可以在那里工作,但是当我使用Dev-C++进行编译时,我总是得到与调试模式相同的垃圾 编辑:我已经建议在calc函数中使用malloc,并在main中使用free,但是我仍
char*calc(字符位12[]
{
int r0,r1,r2,r3;
int i,tmp;
//字符*位16;
char*bit16=malloc(sizeof(char)*(17));
字符位[16];
位16=&位[0];
/*将寄存器设置为零*/
r0=r1=r2=r3=0;
/*先插入最有意义的信息位*/
对于(i=0;i而言,您正在返回一个指向局部变量的指针。尽管这可能会愚弄编译器
char * bit16;
char bits[16];
当返回位16
时,它将不起作用
因为数据存储在calc()
函数的堆栈框架中,因此当函数返回时,数据将被销毁
您需要像这样使用malloc()
和memcpy()
复制值
char *bit16 = malloc(16);
if (bit16 == NULL)
return NULL;
memcpy(bit16, bits, 16);
char * calc(char bit12[], char bit16[])
由于位16
数组没有'\0'
终止符,因此不能将其用作字符串,因此应小心
然后您需要调用free()
返回值calc()
为了避免所有这些,可以将数组作为参数传递给函数,如下所示
char *bit16 = malloc(16);
if (bit16 == NULL)
return NULL;
memcpy(bit16, bits, 16);
char * calc(char bit12[], char bit16[])
然后在调用者函数中
char * calc(char bit12[], char bits[])
char bit16[16];
calc(str, bit16);
在不返回值的情况下,您当然应该删除calc()
函数中位和位16的声明。您返回的是指向局部变量的指针。尽管这可能会愚弄编译器
char * bit16;
char bits[16];
当返回位16
时,它将不起作用
因为数据存储在calc()
函数的堆栈框架中,因此当函数返回时,数据将被销毁
您需要像这样使用malloc()
和memcpy()
复制值
char *bit16 = malloc(16);
if (bit16 == NULL)
return NULL;
memcpy(bit16, bits, 16);
char * calc(char bit12[], char bit16[])
由于位16
数组没有'\0'
终止符,因此不能将其用作字符串,因此应小心
然后您需要调用free()
返回值calc()
为了避免所有这些,可以将数组作为参数传递给函数,如下所示
char *bit16 = malloc(16);
if (bit16 == NULL)
return NULL;
memcpy(bit16, bits, 16);
char * calc(char bit12[], char bit16[])
然后在调用者函数中
char * calc(char bit12[], char bits[])
char bit16[16];
calc(str, bit16);
在不返回值的情况下,您当然应该在calc()
函数中删除位和位16
的声明。垃圾处于“调试”模式,而不是“释放”模式
相信我,这与此无关
char bits[16];
是一个具有自动存储持续时间的本地(数组)变量,一旦它离开其声明范围,即当您的calc
函数返回时,对它的引用将变得无效。当函数结束时,数组停止存在,当您稍后访问该指针/地址时
而不是将本地数组放在堆栈上,malloc
it:
char * bit16 = malloc(sizeof(char)*(17)); //+1 for NUL char
//do something
return bit16;
并在不需要时使用free
清除内存
os = calc(str);
fprintf(dataOut,"%0.16s\n", os);
free(os);
垃圾处于“调试”模式,但不处于“发布”模式
相信我,这与此无关
char bits[16];
是一个具有自动存储持续时间的本地(数组)变量,一旦它离开其声明范围,即当您的calc
函数返回时,对它的引用将变得无效。当函数结束时,数组停止存在,当您稍后访问该指针/地址时
而不是将本地数组放在堆栈上,malloc
it:
char * bit16 = malloc(sizeof(char)*(17)); //+1 for NUL char
//do something
return bit16;
并在不需要时使用free
清除内存
os = calc(str);
fprintf(dataOut,"%0.16s\n", os);
free(os);
您的bits[]
数组是函数的本地数组,即它在函数返回后被释放。因此,返回指针中的值可能会被程序的其他部分覆盖。因此,您很可能会收到垃圾。有时(如在您的版本中)你可以幸运地从那里得到一些有用的东西。但是它是完全不可靠的。你的位[]
数组是函数的本地数组,也就是说,它是在函数返回后释放的。因此,返回指针中的值可能会被程序的其他部分覆盖。因此,你很可能会得到垃圾。有时(就像在你的发行版中一样)你可以幸运地从那里得到一些有用的东西。但这完全不可靠。我做C编程已经很长时间了,但对我来说,你似乎从calc()返回了一个错误的指针。bit16指向bits16[0],但这在函数结束时就失效了
因此,在两次调用之间的短时间内,指针无效:
os = calc(str);
/* here, os points to freed memory */
fprintf(dataOut,"%0.16s\n", os);
我相信,如果你只是在这两行之间添加一些消耗和释放内存的东西,你将能够使你的错误更加可复制
位16[16]可能是calc之外的静态字符数组
很简单。我做C编程已经有很长一段时间了,但在我看来,您似乎从calc()返回了一个错误的指针。bit16指向bits16[0],但在函数结束时,这将变得无效
因此,在两次调用之间的短时间内,指针无效:
os = calc(str);
/* here, os points to freed memory */
fprintf(dataOut,"%0.16s\n", os);
我相信,如果你只是在这两行之间添加一些消耗和释放内存的东西,你将能够使你的错误更加可复制
位16[16]可能应该是静态字符