2011-12-25 71 views
2
int main() 
{ 
    int i=0; 
    int* p_numbers = ((int*) malloc (5*sizeof(int))); 
    int* temp; 
    temp = p_numbers; 
    for(i=0;i<5;i++) 
    { 
     *temp=i; 
     printf("temp %d p_numbers %d",*temp,*p_numbers); 
     temp++;   
    } 
} 

請指出分配給temp的指針,即temp=p_numbersC指針和臨時變量

DOES temp不指向p_numbers指向的同一內存位置?

回答

1
int* p_numbers = ((int*) malloc (5*sizeof(int))); 

       +---+---+---+---+---+ 
p_numbers --> | x | x | x | x | x | 
       +---+---+---+---+---+ 


    int* temp; 
    temp = p_numbers; 

p_numbers --+ +---+---+---+---+---+ 
      +--> | x | x | x | x | x | 
temp--------+ +---+---+---+---+---+ 

您還需要釋放p_numbers,否則您會發生內存泄漏。

也請不投從malloc返回值的習慣,因爲在某些情況下,這可能會導致難以發現的錯誤

解釋:

malloc的定義stdlib.h,如果你忘了包含該頭部,默認情況下,malloc函數將返回int,因爲這是C中沒有原型的函數的方式。現在,如果你有類似char*p = (char*)malloc(12);這可能會導致問題,因爲您有效地將返回的integer鑄造爲char*。通過明確鑄造你的編譯器沉默的警告,如果您有硬件/操作系統,其中sizeof(char*) != sizeof(int)你可能會得到一個很難找到錯誤所以只寫

p_numbers = malloc(5*sizeof(int))

,如果你使用的是C++編譯器,使用new/delete代替。

+0

不錯的解釋....謝謝:) – anshulkatta 2013-02-14 05:15:41

5

變量tempp_numbers將在循環的第一次迭代中指向相同的內存位置。之後,temp正在遞增一個整數,但p_numbers不會。

因爲分配,p_numbers = [0,1,2,3,4]的,所以你會打印出:指針

temp 0 p_numbers 0 
temp 1 p_numbers 0 
temp 2 p_numbers 0 
temp 3 p_numbers 0 
temp 4 p_numbers 0 

覺得作爲指向的內存地址,而不是更像Java參考語法。

1

是的。

但是,當你打印輸出,你只增加其中一個,所以另一個仍然指向第一個元素。

見,當你增加他們兩個會發生什麼:

int main() 
{ 
    int i=0; 
    int* p_numbers = ((int*) malloc (5*sizeof(int))); 
    int* temp; 
    temp = p_numbers; 
    for(i=0;i<5;i++) 
    { 
     *temp=i; 
     printf("temp %d p_numbers %d",*temp,*p_numbers); 
     temp++;   
     p_numbers++; // see the result when you add this line 
    } 
} 

輸出:

temp 0 p_numbers 0temp 1 p_numbers 1temp 2 p_numbers 2temp 3 p_numbers 3temp 4 p_numbers 4 

順便說一句,並不重要,但它更有效的預增量比後增量(++i++temp++p_numbers )它在返回之前不需要創建變量的副本。

0

是的,您正在將指針temp的值設置爲指針p_numbers的值。

1

溫度指向與p_numbers相同的內存位置。但for循環會給出不同的輸出。因爲你只增加臨時內存地址。您還需要增加p_number內存地址。

temp++;    
p_numbers++; 

這樣兩個指向相同的地址位置並給出相同的輸出。

1

溫度點爲p_numbers指向同一個內存位置

回答您的代碼將

溫度0 p_number 0

溫度1 p_number 0

溫度2 p_number 0

temp 3 p_number 0

temp 4 p_number 0

使用p_number ++使指針p_number也增加。

1

由於這種說法,兩個指針都指向相同的內存位置。

temp = p_numbers;

在for循環中,增加temp將使它指向先前的內存位置,這使得它與p_numbers不同。