2014-11-04 43 views
0

我有以下情況:調用未初始化的變量,在C t的函數

int aFunction() { 
    int cc; 
    double *doubleValue; 
    double atod(); 

    *doubleValue = atod ("12.3", &cc); 

} 

據我瞭解atod是指向一個功能,它返回一個double,它似乎是,當atod被調用,它不被初始化。

對嗎?這段代碼在生產中運行時會發生什麼?

+0

'double atod();'是一個名爲atod的函數函數原型,它接受一個未指定數量的參數並返回一個double。 'double(* atod)();'是指向這樣一個函數的指針。 – mch 2014-11-04 12:47:01

+0

函數指針的語法不應該像(* pointername)(參數)...就我所知,doubleValue是一個指向雙變量的指針... doble atod()...逃離我。 ..如果這是C++,我會說你正在構建一個雙名爲atod。當然,我可能是錯的。 – 2014-11-04 12:48:25

+1

由於您在此處取消引用未初始化的指針,您將會得到未定義的行爲(最有可能是崩潰):'* doubleValue = atod(「12.3」,&cc);'.BTW'atod'定義在哪? – 2014-11-04 12:48:37

回答

0

一個函數指針應該是這樣的:

double (*atod)(); 

你有什麼是一個原型。如果你把它的功能外,您會把它:

double atod(); 

int aFunction() { 
    int cc; 
    double *doubleValue = malloc(sizeof(double)); 

    *doubleValue = atod ("12.3", &cc); 
} 

的編譯器/連接簡單地從別的地方找到atod功能。

我不明白爲什麼有人會選擇這樣做,而不是包含正確的頭文件。

(我假設的錯誤與未初始化double *是由你減少的例子引起的。)

1

丟棄代碼從生產馬上。

你訪問一個未初始化的指針,並得到不確定的行爲:

double *doubleValue; 
*doubleValue = ... 

反正這樣的:

double atod(); 

原型,採用的參數數目不詳的函數(和如果沒有在別處定義,可能會導致鏈接錯誤)並返回一個double。爲了有一個函數指針,你應該寫相當:

double function() { 
    return 2.0; 
} 

int main() 
{ 
    double (*atod)(); // Pointer to function 
    atod = &function; 
} 

Example

+0

'double atod();'是一個函數原型,而不是一個函數聲明,它需要一個未指定數量的參數。 – mch 2014-11-04 12:54:30

+0

@mch我的不好,C++在這方面是不同的。 – 2014-11-04 12:55:54

0

主要有以下的問題,我可以從第一眼看到:

  1. 的doubleValue是一個指針。您必須在之前分配之下的內存,然後才能解除引用並將atod()結果分配給。
  2. atod()應​​該在某個庫中實現(或從共享庫導入),否則你的代碼會編譯並且不會鏈接到
0

讓我困惑的是我不知道可以將原型放在函數體內,所以我錯誤地認爲它是一個從未初始化的函數的指針。我搜索並找到在另一個庫中定義的atod函數。代碼是正確的。

doubleValue錯誤是我的錯誤,試圖簡化將問題呈現給您的問題。實際上doubleValueaFunction的一個參數,並且已經被初始化。

再次感謝大家。你一直很快,很有幫助。