2015-02-11 72 views
0

調試時我發現我的程序停在:「cout < < * ptr; cout < <」\ n「;」這段代碼有什麼問題?反指這個指針有什麼問題?

#include<iostream> 

using namespace std; 
int *ptr = 0; 
void myfun(void); 

int main() 
{ 
    void myfun(); 
    for(int j = 1; j < 3; j++) 
    { 
     ptr = ptr-j ;  
     cout << *ptr ; cout << "\n"; 

    } 
    return(0); 
} 

void myfun(void) 
{ 
    int x[3] = {11,12,13}; 
    for(int i = 0; i <3; i++) 
    { 
     ptr = &x[i]; 
     ptr = ptr+1; 
    } 
} 
+5

'空隙myfun();'不調用一個函數。這是一個函數聲明。 – 2015-02-11 05:06:59

回答

0

在上面的答案和一點谷歌搜索後,我發現了我的問題的確切解決方案:從函數返回可變大小的數組。

這是代碼:

#include<iostream> 

using namespace std; 
int * myfun(void); 

int main() 
{ 
    int *ptr; 
    ptr = myfun(); 
    int len = (sizeof(ptr)/sizeof(*ptr)); 
    for(int j = 0; j <= len; j++) 
    { 
     cout << ptr[j]; 
    } 
    return(0); 
} 
int * myfun() 
{ 
    static int x[3] = {11,12,13}; 
    return x; 
} 
+0

對不起,但這是不正確的。「工作」的唯一原因是因爲指針的大小恰好是大小的兩倍在你的環境中使用int也是如此,如果它能工作,在你的循環中使用「<=」而不是「<」是什麼動機?嘗試在你的數組中添加另一個數字並自己去看看 – rjnilsson 2015-02-13 06:41:35

+0

比是否正確使用此方法? – explorer 2015-02-15 08:00:28

+0

如果被調用的函數負責決定數組的大小,那麼該數組的大小也應該返回從功能。一種可能性是使用size_t *類型的「out」參數。不過,我建議你研究動態內存分配,以便以更通用的方式解決這個問題。即malloc/free等。 – rjnilsson 2015-02-17 06:26:17

8

您零

int *ptr = 0; 

這意味着它是一個空指針初始化的指針。

然後,您將指針運算應用於空指針。行爲是未定義的。您正在取消以這種方式獲取的無意義指針。行爲是未定義的。

注意

void myfun(); 
main

不是一個函數調用,它是一個函數聲明。到myfun調用(這顯然是你的意圖)將如下所示

myfun(); 

你爲什麼把那個void在有你的代碼的版本?

+0

我弄錯了。現在我得到13,0,0作爲我的輸出。我該如何獲得13,12,11? – explorer 2015-02-11 05:12:16

+0

@jeniShah這完全是一個完全不同的問題。 – JustSid 2015-02-11 05:23:31

+3

在任何情況下,myfun都會將指針設置爲指向堆棧上一旦myfun退出就立即失效的位置。此外,循環的最後一次迭代將指針指向超出數組末尾的位置,這也是未定義的。然後主函數從指針中減去總數爲6,這導致在現在無效數組開始之前的位置。這個代碼有太多的問題,甚至開始想象什麼是正確的版本。 – 2015-02-11 05:32:27

0

你的變量ptr是一個野指針。

雖然你讓ptr porint到數組x,但當myfun()完成並返回x的內存時,它已經變成了destory。所以在主函數中,ptr變成野指針,你的程序會崩潰。

您應該知道,當局部變量不在其範圍內時,局部變量將被取消。

+0

「我得到了我的錯誤,現在我得到13,0,0作爲我的輸出。我應該怎麼做才能得到13,12,11「 雖然你已經打印了答案,但它並不安全,你的程序有潛在的崩潰問題。 – 2015-02-11 05:16:51

0

主函數無法訪問數據,因爲數組x [3]的範圍是myfun(void)。調用myfun(它應該是myfun();而不是void myfun();),ptr將指向未分配的內存位置。

要打印主函數中的數據,可以將int x[3]聲明爲全局變量。

int *ptr = 0; 
void myfun(void); 

int x[3] = {11,12,13}; 

int main() 
{ 
    int *temp_ptr; 
    myfun(); 
    temp_ptr = ptr; 
    for(int j = 1; j <= 3; j++) 
    { 
     temp_ptr = ptr-j ;  
     cout << *temp_ptr ; cout << "\n"; 

    } 
    return(0); 
} 
+0

我的目標是返回函數內部生成的值。不知道數組的長度 – explorer 2015-02-11 09:01:10

+0

然後,你必須返回一個指針與分配的內存 – 2015-02-11 10:35:44