我在多次调用返回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()。当我第一次调用它时,我有适当的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()的代码:
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);
}发布于 2019-08-27 12:31:25
这里出了不少问题。
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()返回的值,并将其存储到ainpath中的第34字符,这可能不是您想要的。使用指针代替:
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);
}https://stackoverflow.com/questions/57674194
复制相似问题