Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回char指针的C函数将垃圾放入;“调试”;模式,但不在“中”;“释放”;模式_C_Visual Studio 2012_Visual Studio Debugging_Release Mode - Fatal编程技术网

返回char指针的C函数将垃圾放入;“调试”;模式,但不在“中”;“释放”;模式

返回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,但是我仍

只需编写一个简单的C程序来读取一个长的二进制文件,将其分成12位的块,并附加4位CRC,然后输出到另一个文件。当我在调试模式(VisualStudio2012)下运行代码时,它会返回垃圾,但一旦切换到发布模式,它就会正常工作

切换回调试模式似乎也不会带来问题。。。只是想了解这里发生了什么。无论VS使用“发布模式”做什么,代码都可以在那里工作,但是当我使用Dev-C++进行编译时,我总是得到与调试模式相同的垃圾

编辑:我已经建议在calc函数中使用malloc,并在main中使用free,但是我仍然得到垃圾输出。VS实际上在运行时崩溃


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]可能应该是静态字符