我写了以下的c代码。
#include <stdio.h>
#include <stdlib.h>
char *read_from_file()
{
FILE *ptr_file;
char buf[22];
char buf_old[sizeof(buf)];
char candata_needed[4];
ptr_file =fopen("/home/pi/probe.txt","r");
if (!ptr_file){
fclose(ptr_file);
return 1;
}
if (fgets(buf,sizeof(buf), ptr_file)!=NULL){
if(memcmp(buf, buf_old, sizeof(buf)))
{
memcpy(candata_needed, buf + 17, sizeof(buf));
memcpy(buf_old, buf, sizeof(buf));
}
}
fclose(ptr_file);
return (candata_needed);
}
int main()
{
char *candata;
int i;
while(1){
printf("stape 1\n");
candata=read_from_file()
for(i=0; i<4; i++)
{
candata[i] = *(candata + i);
}
printf("candata: %s\n", candata);
}
free(candata);
return 0;
}
函数应读取文件并将内容(内容为22十六进制数)存储在数组中。从22十六进制数字,我只需要4,所以我将4十六进制数存储在一个数组(candata_needed)中。
所以我想从主函数中的函数中获取存储的4进制数字指针。我尝试malloc
,但我反复出现错误double free or corruption (fasttop)
。随着指针没有出现。
有人可以帮忙吗?
答案 0 :(得分:2)
您正在返回指向本地数组的指针。一旦函数返回,该局部数组就会超出范围,只留下指向不再存在的数组的指针。尝试使用此指针将导致未定义的行为。
有一些解决方案:
使数组成为全局变量。
制作数组static
。这意味着它的生命周期延长到程序的生命周期,返回它后指向它的指针仍然有效。
使用malloc
动态分配,并返回该指针。一旦完成记忆,不要忘记free
。
在调用函数中创建数组,并将指针作为参数传递给它。让函数填充该数组。如果函数不知道大小(可能元素的数量),则需要将其作为参数传递。
我个人推荐最后一个解决方案,但“最佳”可能因用例而异。我真的 不 推荐第一个解决方案,使其成为全局变量。我也不喜欢第二个,使变量成为static
变量,它与拥有全局变量IMO没有什么不同。
答案 1 :(得分:2)
candata_needed
具有自动存储持续时间。当函数结束时,它将超出范围。所以不要试图返回指针!
使用返回指针的行为是 undefined 。
一种解决方案是将字符缓冲区及其大小传递给read_from_file
。
答案 2 :(得分:0)
@Joachim Pileborg:我已经改变了我的代码,我现在正在使用malloc
:
#include <stdio.h>
#include <stdlib.h>
void read_from_file(char *result, int lenght_result)
{
FILE *ptr_file;
char buf[22];
char buf_old[sizeof(buf)];
char candata_needed[4];
//while(1){
ptr_file =fopen("/home/pi/probe.txt","r");
if (!ptr_file){
return 1;
}
if (fgets(buf,sizeof(buf), ptr_file)!=NULL){
if(memcmp(buf, buf_old, sizeof(buf)))
{
memcpy(candata_needed, buf + 17, sizeof(buf));
strncpy(result, candata_needed, lenght_result);
memcpy(buf_old, buf, sizeof(buf));
}
}
fclose(ptr_file);
}
int main()
{
int i;
int size=4;
char *candata = malloc(size);
while(1){
read_from_file(candata, size);
printf("candata: %s\n", candata);
}
free(candata);
return 0;
代码有效,我可以获取数据。这样可以,还是不推荐? 我的最终目标是将数据作为输出发送到另一个c proram。 我是C新手,我很难找到解决这个问题的最佳方法。