c函数与数组不返回值

时间:2016-08-24 12:02:28

标签: c arrays malloc

我写了以下的c代码。

#include <stdio.h>
#include <stdlib.h>

char *read_from_file()
{

    FILE *ptr_file;
    char buf[22];
    char buf_old[sizeof(buf)];
    char candata_needed[4]; 
        ptr_file =fopen("/home/pi/probe.txt","r");
        if (!ptr_file){
            fclose(ptr_file);
            return 1;
        }
        if (fgets(buf,sizeof(buf), ptr_file)!=NULL){

            if(memcmp(buf, buf_old, sizeof(buf)))
            {
                memcpy(candata_needed, buf + 17, sizeof(buf));              
                memcpy(buf_old, buf, sizeof(buf));
            }
        }       
        fclose(ptr_file);    
   return (candata_needed);        
}    

int main()
{
        char *candata;
        int i;

    while(1){
        printf("stape 1\n");        
        candata=read_from_file()
        for(i=0; i<4; i++)
        {
            candata[i] = *(candata + i);
        }
        printf("candata: %s\n", candata); 
    }
        free(candata);
        return 0;
}

函数应读取文件并将内容(内容为22十六进制数)存储在数组中。从22十六进制数字,我只需要4,所以我将4十六进制数存储在一个数组(candata_needed)中。 所以我想从主函数中的函数中获取存储的4进制数字指针。我尝试malloc,但我反复出现错误double free or corruption (fasttop)。随着指针没有出现。 有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

您正在返回指向本地数组的指针。一旦函数返回,该局部数组就会超出范围,只留下指向不再存在的数组的指针。尝试使用此指针将导致未定义的行为

有一些解决方案:

  • 使数组成为全局变量。

  • 制作数组static。这意味着它的生命周期延长到程序的生命周期,返回它后指向它的指针仍然有效。

  • 使用malloc动态分配,并返回该指针。一旦完成记忆,不要忘记free

  • 在调用函数中创建数组,并将指针作为参数传递给它。让函数填充该数组。如果函数不知道大小(可能元素的数量),则需要将其作为参数传递。

我个人推荐最后一个解决方案,但“最佳”可能因用例而异。我真的 推荐第一个解决方案,使其成为全局变量。我也不喜欢第二个,使变量成为static变量,它与拥有全局变量IMO没有什么不同。

答案 1 :(得分:2)

candata_needed具有自动存储持续时间。当函数结束时,它将超出范围。所以不要试图返回指针!

使用返回指针的行为是 undefined

一种解决方案是将字符缓冲区及其大小传递给read_from_file

答案 2 :(得分:0)

@Joachim Pileborg:我已经改变了我的代码,我现在正在使用malloc

#include <stdio.h>
#include <stdlib.h>

void read_from_file(char *result, int lenght_result)
{

    FILE *ptr_file;
    char buf[22];
    char buf_old[sizeof(buf)];
    char candata_needed[4]; 
    //while(1){
        ptr_file =fopen("/home/pi/probe.txt","r");
        if (!ptr_file){
            return 1;
        }
        if (fgets(buf,sizeof(buf), ptr_file)!=NULL){

            if(memcmp(buf, buf_old, sizeof(buf)))
            {

                memcpy(candata_needed, buf + 17, sizeof(buf));
                strncpy(result, candata_needed, lenght_result);

                memcpy(buf_old, buf, sizeof(buf));
            }
        }

        fclose(ptr_file); 
}


int main()
{
        int i;
        int size=4;
        char *candata = malloc(size);           
    while(1){

        read_from_file(candata, size);

        printf("candata: %s\n", candata); 

    }
    free(candata);        
    return 0; 

代码有效,我可以获取数据。这样可以,还是不推荐? 我的最终目标是将数据作为输出发送到另一个c proram。 我是C新手,我很难找到解决这个问题的最佳方法。