c - 空闲字符内存
问题描述
我在多次调用返回 char 值的函数时遇到问题。我想将该函数的返回值重新分配给另一个函数中的 char 变量。这是我调用函数 init_current() 的函数代码:
int current_live_read(int *current)
{
char ainpath[33];
ainpath[33]=init_current();
char *filename = ainpath;
int curr;
FILE *file = fopen(filename, "r");
fscanf(file, "%4d", &curr);
if(!feof (file))
{
}
fclose(file);
*current=curr;
return(0);
}
在这个函数中,我调用了函数 init_current()。当我第一次调用它时,我有正确的 ainpath[33] 变量返回值。但是,当我第二次调用 current_live_read(int *current) 时,我在 fscanf 中出现错误,因为第二次调用后的变量 ainpath[33] 是“名称:ainpath 详细信息:'\0',”\027Î\001\ 0Túÿ¾\0\037ã\225r.16\0\0\b\0" 默认值:0xbefffa28 十进制:-1090520536 " 这肯定是不正确的。我认为我需要以某种方式释放数组 ainpath[33] 但我不知道如何。
这是 init_current() 的代码:
char init_current(void)
{
system("sudo echo cape-bone-iio > /sys/devices/bone_capemgr.*/slots"); //Init ADC
system(AINpath);
//int file;
char ainpath[33];
char *filename = "/root/LED_Tester_V1/CurrentRead/pathbuf";
char * buffer = 0;
long length;
FILE * f = fopen (filename, "rb");
if (f)
{
fseek (f, 0, SEEK_END);
length = ftell (f);
fseek (f, 0, SEEK_SET);
buffer = malloc (length);
if (buffer)
{
fread (buffer, 1, length-1, f);
}
fclose (f);
}
if (buffer)
{
sprintf(ainpath, "%s%d", buffer, AIN);
}
return(ainpath);
}
解决方案
这里有很多事情出错了。
return(ainpath);
您将指针返回到本地数组,该数组将在函数退出时被销毁。相反,分配更多内存:
buffer = malloc(length+10); // I don't know what AIN is, but it has to fit!
然后写入buffer
, notainpath
并返回它,因为它在函数调用中持续存在。
if (buffer)
{
sprintf(buffer, "%s%d", buffer, AIN);
}
return buffer; // return the malloc'd buffer here
由于我们要返回一个指针,init_current
因此应该定义为(注意*
):
char *init_current(void)
{
...
最后,
ainpath[33]=init_current();
不做你认为它做的事。它接受init_current()
which 返回的值是一个指针,并将其存储到 中的第 34 个字符ainpath
,这可能不是您想要的。改用指针:
int current_live_read(int *current)
{
char* ainpath;
ainpath=init_current();
int curr;
FILE *file = fopen(ainpath, "r");
free(ainpath); // Free when you are done using the buffer
if(!file)
return -1;
fscanf(file, "%4d", &curr);
if(!feof (file))
{
}
fclose(file);
*current=curr;
return(0);
}
推荐阅读
- xml - XML::Simple 和命名空间
- java - `pemParser.readObject()` 返回 PrivateKeyInfo 的实例
- excel - 如何使用 excel 中的查找功能执行此操作?
- python - “导入错误”:在 django 中将管理文件从一个项目文件夹导入到同一目录下的另一个
- c# - c# Outlook 实例化 Items 集合以在循环中添加项目
- stripe-payments - 如何在使用 Stripe 提交付款之前检查用户电子邮件
- python - Django admin/Chart js 错误 - super() 至少需要 1 个参数(给定 0)
- c - 特定情况的分段错误(核心转储)
- excel - EXCEL:如何增加工作表但使用自动填充保持单元格引用相同?
- javascript - 在 Const 中反应 userParams