2011-12-25 65 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不同。