簡體   English   中英

將指針/數組從函數傳遞給main()

[英]Passing pointer/array to main() from a function

我正在學習函數/指針,並且遇到了一些問題。 我需要編寫的是一個帶有main()和另外兩個函數的C程序。

要求:

  1. read_funct()必須使用malloc()分配足夠的內存來存儲數據。

  2. read_funct函數原型必須是:

     int read_funct(int *data_num, double **data_vals, char *filename) 

它是如何工作的:

  1. main()調用第一個函數: read_funct()

  2. read_num()從文件中讀取二進制數據。 必須提取兩個值:no。 值(前4個字節),然后是值本身(每個8個字節,因此包含在下一個8 *值的值中)。 這些對應於data_numdata_vals 必須打印它們,然后程序返回main()

  3. main()執行操作以編輯第一個文件中的數據。

  4. main()調用第二個函數: write_funct() ,它將編輯后的數據寫入新文件。

我在哪里:

第一個函數正確讀取data_num ,並讀取/打印data_vals 這一切都正常。 但是,我正在嘗試在main()打印這些,以驗證我正在對正確的數據執行操作,但我無法使其正常工作。

注意:我現在並沒有嘗試使用write_funct() ,只是逐步進行。

這是我當前的main()代碼:

int read_funct(int *data_num, double **data_vals, char *filename);
int main()
{
  int data_num;
  double **data_vals;

  //Reads file using read_funct()
  read_funct(&data_num, data_vals, filename);

  //Check: print data_num
  printf("\nCheck No. of Values: %d\n", data_num);

  //Check: print data_vals
  for(int i = 0; i<data_num; i++)
  {
        printf("%0.3lf\t", data_vals[i]);
  }
  return(0);
}

這是read_funct(

int read_funct (int *data_num, double **data_vals, char *filename)
{
    FILE * fp = fopen(filename, "rb");                          //Opening file      
   //There's code here to check valid file open

   //There's code here to determine size and check valid length

  //Proceed with reading data_num if file is large enough
  char buffer_n[4];
  fread(buffer_n, 4, 1, fp);
  int res = buffer_n[0]|(buffer_n[1] << 8)|(buffer_n[2] << 16)|(buffer_n[3] << 24);     //Convert endian

  data_num = &res;          //Passes results back to data_num
  printf("Number of Data Values: %d \n", *data_num);    //Printing results

  //Proceeds with calculating data_vals
  data_vals = malloc(8*res);                //Allocating memory
  fread(data_vals, 8, res, fp); 

    //Prints data_vals
    for(int i=0; i<res; i++)
    {
        printf("%0.3f\t", data_vals[i]);
    }
    printf("\nEnd of File Read.\n\n");
    fclose(fp); 
    free(data_vals);                //Free allocated memory
    return(0);
}

期望的輸出:

基本上,我希望它從read_file()內部打印出值,然后在main()打印一個檢查,所以輸出將是這樣的:

No. of values: 3            //From printf in read_file()
2 4 6

Check No. of values: 3      //From printf in main()
2 4 6

在哪里,我認為我錯了:

  1. 相當確定的主要問題是我搞砸了我的指針,以及我如何在main()初始化東西。 我一直在努力解決這個問題,但我認為我需要一些更有經驗的幫助來解決這個問題。

  2. 我知道每個malloc()調用必須有一個后續的free() ,但我擔心這樣做的方式,也許我已經做到了這樣我無法在main()檢索它。 是否需要有一個分配內存的中間緩沖區?

將非常感謝幫助使此代碼正常工作。 謝謝!

除了過早釋放數據外,您還有另一個問題:

double **data_vals;
read_funct(&data_num, data_vals, filename);

如果希望data_vals填充(寫入,修改) data_vals ,則必須傳遞其地址,就像使用data_num

這是另一個略有不同的解釋。 你看,你聲明了data_vals但你沒有給它賦值 - 它包含了垃圾。 因此,將data_vals傳遞給任何函數或在任何表達式中使用它都是沒有意義的。 相反,通過直接賦值或將其地址傳遞給函數來為函數填充變量賦予它一些意義

然后,您對data_vals的使用描繪了一個向量或一個數組。 所以你真的需要用[]聲明一個數組,或者可能是一個指針(指針和數組在C中非常相關/可互換)。 main()函數的邏輯需要指針,而不是指向指針的指針 因此,這是合適的:

double *data_vals;

相反,寫入指針變量的函數需要寫入變量的地址; 換句話說: 指向指針的指針 這就是您的函數具有此(正確)簽名的原因:

read_funct(..., double **data_vals, ...)

要輕松理解,請查看您正確編寫的其他(更簡單)的內容:

int data_num;
read_funct(&data_num, ...);  // declaration: read_funct(int *data_num, ...)

在main() data_num聲明為整數; 使用指向整數指針的形式參數聲明read_funct(),然后調用read_funct()傳遞變量data_num 的地址 完善。 現在,對其他變量data_vals執行相同的data_vals 您將其聲明為double的指針 ,使用符號&data_vals將其地址傳遞給read_funct(),並且函數read_funct()將該參數聲明為指向double的指針 (並使用*data_vals = ...寫入它。可以看出兩個變量之間的並行性吧?

可能是我太迂腐了,但你的問題非常清楚,形成得很好,所以我試着做同樣的事情。

是的,你過早地釋放緩沖區了。 在釋放它之后,不能保證它包含什么。 你可以在主要結束時釋放它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM