首页 > 解决方案 > 空闲字符内存

问题描述

我在多次调用返回 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 十进制:-10905205​​36 " 这肯定是不正确的。我认为我需要以某种方式释放数组 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);
}

标签: cembedded

解决方案


这里有很多事情出错了。

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);
}

推荐阅读