簡體   English   中英

用C函數將指針返回數組

[英]Return the pointer to array by C function

假設我有以下C函數:

double * cross_product( double vec1[3], double vec2[3] )
   {
    double *outvec ;

     *(outvec + 0)= vec1[1]*vec2[2] - vec1[2]*vec2[1];
     *(outvec + 1)= vec1[2]*vec2[0] - vec1[0]*vec2[2];
     *(outvec + 2)= vec1[0]*vec2[1] - vec1[1]*vec2[0];
     return outvec ;
 }

為什么程序在執行而不是在編譯階段返回錯誤?

這一個也不起作用

double * cross_product_2( double vec1[3], double vec2[3] )
   {
    double var ;
    double *outvec = &var;

     *(outvec + 0)= vec1[1]*vec2[2] - vec1[2]*vec2[1];
     *(outvec + 1)= vec1[2]*vec2[0] - vec1[0]*vec2[2];
     *(outvec + 2)= vec1[0]*vec2[1] - vec1[1]*vec2[0];
     return outvec ;
// }

您剛剛創建了指針“ outvec”,但是您不知道它指向的位置。 我的意思是,您沒有分配指針outvec將寫入的內存。 它只是試圖在隨機存儲空間上寫入數據。
您需要在要開始寫入數據的位置“告訴”指針,並保留該空間供您使用。
如Joel所說,請嘗試使用以下代碼:

double *outvec = malloc(3 * sizeof(double)); 

抱歉我的英語不好...祝你好運!

您尚未初始化outvec指針,因此您嘗試將數據寫入空(或垃圾)地址。 嘗試分配一些內存以使其首先指向或聲明一個靜態數組以從函數中返回。

例如

double *outvec = malloc(3 * sizeof(double));

由於編譯器在編譯時不評估outvec ,因此會出現運行時錯誤。 因此,它不知道您將在運行時嘗試訪問哪個地址。

double *outvec包含垃圾,因為您尚未初始化或分配任何值
對此。 “ outvec”上的任何操作都是對垃圾的操作,因此結果也包含垃圾。

更正第二個代碼:

     REVISED CODE 
double * cross_product_2( double vec1[3], double vec2[3] )
       {
        double *outvec = NULL; // new change
        outvec = (double *)malloc(sizeof(double)*3); //since you need space for 3 
                                                    //doubles         


     /* 
           *(outvec + i) means, that the calculated value is to be stored at the ith 
             index of the address pointed to by the outvec pointer. That is how arrays
              are indexed using pointers 
     */
         *(outvec + 0)= vec1[1]*vec2[2] - vec1[2]*vec2[1];
         *(outvec + 1)= vec1[2]*vec2[0] - vec1[0]*vec2[2];
         *(outvec + 2)= vec1[0]*vec2[1] - vec1[1]*vec2[0];
         return outvec ;
    // }

說明:

您已聲明以下變量-
雙* outvec;
“ outvec”是一個指針,用於存儲將存儲結果的地址。 作為指針的變量“ outvec”將指向將存儲結果的地址。 但是由於您尚未指定該地址是什么,因此“ outvec”指向
到一些垃圾地址。 這就是為什么我們需要指定要存儲結果的地址,為此
我們需要使用一些有效地址來初始化或分配“ outvec”變量。

暫無
暫無

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

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