[英]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.