可用的Char内存

时间:2019-08-27 11:58:03

标签: c embedded

我多次调用返回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]为“ Name: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);
}

1 个答案:

答案 0 :(得分:0)

这里有很多错误。

data= pd.merge(data, cont, how='left', on=['DateOfOutage','Tech','Sites'])

MTTR    WhiteList   DateOfOutage    Vendor  Tech    Sites   id  Contribution
25  FALSE   2019-08-01 00:00:00 ERICSSON    2G  UPP5975 5975    0.0000 %
18  FALSE   2019-08-02 00:00:00 ZTE 3G  UPP5975 5975    0.0000 %
17733   FALSE   2019-08-03 00:00:00 ERICSSON    3G  UPP5806 5806    0.0000 %
17730   FALSE   2019-08-04 00:00:00 ERICSSON    3G  UPP5806 5806    0.0000 %
3419    FALSE   2019-08-01 00:00:00 ZTE 2G  UPP2347 2347    0.0000 %
10  FALSE   2019-08-02 00:00:00 ZTE 2G  UPP2347 2347    0.0000 %
4   FALSE   2019-08-03 00:00:00 ZTE 2G  UPP2347 2347    0.0249 %
1   FALSE   2019-08-04 00:00:00 ZTE 2G  UPP2347 2347    0.0000 %
1   FALSE   2019-08-01 00:00:00 ZTE 2G  UPP2347 2347    0.0000 %
1   FALSE   2019-08-02 00:00:00 ZTE 2G  UPP2326 2326    0.0000 %
5   FALSE   2019-08-03 00:00:00 ZTE 2G  UPP2326 2326    0.0000 %
3   FALSE   2019-08-04 00:00:00 ZTE 2G  UPP2326 2326    0.0000 %

您正在将指针返回到本地数组,该数组将在函数退出时销毁。而是分配更多的内存:

return(ainpath);

然后将其写入buffer = malloc(length+10); // I don't know what AIN is, but it has to fit! 而不是buffer并返回它,因为它在函数调用之间仍然存在。

ainpath

由于我们要返回一个指针,因此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()中的第34个字符中,这可能不是您想要的。改用指针:

ainpath