2016-08-24 39 views
-2

我寫了下面的c代碼。帶數組的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,所以我存儲在陣列(candata_needed)4個十六進制數字。 所以我想從主函數的函數中獲取存儲的4個十六進制數字的指針。我嘗試了malloc,但我多次成爲錯誤double free or corruption (fasttop)。指針沒有出現。 任何人都可以幫忙嗎?

+0

'if(!ptr_file)fclose(ptr_file);'沒有意義。如果文件沒有打開,則不需要關閉它。事實上,你在這種情況下調用'fclose(0)';那當然不能做任何有用的事情! –

+1

有趣的是你*應該*使用malloc或類似的機制,並且你標記[tag:malloc],但你*不使用它! –

+0

注意:'return'不是一個函數,而是一個聲明。不要把括號放在一個簡單的參數上,這可能會導致錯別字的錯誤。 – Olaf

回答

2

您正在返回一個指向本地數組的指針。一旦函數返回,該局部數組超出範圍,留下一個指向不再存在的數組的指針。試圖使用此指針將導致未定義的行爲

有幾個解決方案:

  • 使數組的全局變量。

  • 製作陣列static。這意味着它的生命週期延長到程序的生命週期,並且在返回它之後指向它的指針仍然有效。

  • 使用malloc動態分配,並返回該指針。一旦完成了記憶,請不要忘記free

  • 在調用函數中創建數組,並將指針傳遞給它作爲參數。讓該函數填充該數組。如果該函數不知道大小(可能元素的數量),則還需要將其作爲參數傳遞。

我個人推薦最後的解決方案,但「最好」可能因使用情況而異。我真的不要推薦第一個解決方案,使其成爲一個全局變量。我也不喜歡第二個,使變量變量爲static變量,它與具有全局變量IMO確實沒有什麼不同。

+1

Upvoted:我更喜歡國家英里的最終解決方案。 – Bathsheba

+0

謝謝我再次嘗試使用malloc,它是處理函數中數組的「最佳」方式。 –

+1

我無法抗拒,請原諒我:這種方法存在的一個問題是,如果這個函數在一個庫中結束,那麼該庫的'malloc'可能會使用與'free'不同的C運行時庫。讓你的電腦慢慢融化。 – Bathsheba

2

candata_needed具有自動存儲持續時間。當函數結束時它將超出範圍。所以不要試圖返回一個指針!

使用返回指針的行爲是undefined

一種解決方案是將字符緩衝區及其大小傳遞到read_from_file

0

@Joachim Pileborg:從來就現在使用malloc改變了我的代碼,並i'm:

#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新手,很難找到解決此問題的最佳方法。