首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自由查内存

自由查内存
EN

Stack Overflow用户
提问于 2019-08-27 11:58:03
回答 1查看 183关注 0票数 0

我在多次调用返回char值的函数时遇到问题。我希望将返回值从该函数重新分配到另一个函数中的char变量。下面是函数的代码,我在这里调用函数init_current():

代码语言:javascript
复制
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()。当我第一次调用它时,我有适当的ainpath33变量返回值。但是,当我第二次调用current_live_read(int * ainpath33 )时,第二次调用后的变量ainpath33是"Name : ainpath Details:'\0‘“,\027\001\0Túr\\037\225r.16\0\0\b\0”默认值:0xbefffa28Decimal:-1090520536,这肯定是不正确的。我认为我需要以某种方式释放数组ainpath33,但我不知道如何释放。

下面是init_current()的代码:

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-27 12:31:25

这里出了不少问题。

代码语言:javascript
复制
return(ainpath);

您将返回指向本地数组的指针,该数组将在函数退出时被销毁。相反,分配更多的内存:

代码语言:javascript
复制
buffer =  malloc(length+10); // I don't know what AIN is, but it has to fit!

然后写入buffer,而不是ainpath并返回它,因为它在函数调用中持续存在。

代码语言:javascript
复制
if (buffer)
{
    sprintf(buffer, "%s%d", buffer, AIN);
}

return buffer; // return the malloc'd buffer here

由于我们要返回一个指针,所以应该将init_current定义为(注意*):

代码语言:javascript
复制
char *init_current(void)
{
...

最后,

代码语言:javascript
复制
ainpath[33]=init_current();

不会像你想的那样做。它接受作为指针的init_current()返回的值,并将其存储到ainpath中的第34字符,这可能不是您想要的。使用指针代替:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57674194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档