未在指针给出的地址处显示正确的值

时间:2014-02-12 18:20:38

标签: c pointers memory-address

我在最后一行的某个地方犯了一个错误。它没有在地址上显示正确的值。

   /* an array with 5 elements */
   double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
   double backup[5];
   double *p;
   double address;

   int i = 0;

   memcpy(&backup, &balance, sizeof(balance));
   p = backup;

   /* output each array element's value */
   printf( "Array values using pointer\n");
   for ( i = 0; i < 5; i++ )
   {
       //printf("*(p + %d) : %f\n",  i, *(p + i) );
       printf("&p[%d] : %f\n",  i,  p[i]);
       printf("&p[%d] : address: %p\n",  i,  (void*)(&p+i));
   }

   int offset = 4;
   printf("Contents of &p[%d] : address: %x is %f\n",  offset,  ((&p)+(offset)), p[offset]);
   double* newPointer;
   newPointer = ((&p)+(offset));
   printf("The content again: %f at address: %x\n",  *(newPointer), newPointer);

//输出不正确

内容: 0.000000 ,地址:28feec

3 个答案:

答案 0 :(得分:4)

从我说的打字开始,这就是:

newPointer = ((&p)+(offset));

应该是:

newPointer = p + offset;

此:

((&p)+(offset))
当你取double **的地址时,

返回double *。添加到此任何偏移仍然留下double **。您肯定不希望分配给double *

  

我在最后一行某处犯了错误

在“最后一行”之前,在p地址的错误也是在其他几个位置进行的。


再次指出:

要打印出指针的值,请将其转换为void *(如果已经不是),并使用p转换说明符:

printf("The content again: %f at address: %p\n",  *newPointer, (void *) newPointer);

使用xdi可以减少一半地址的重要位数。

答案 1 :(得分:2)

double *p;这里p本身是一个地址定位指针p。因此,在添加偏移量时,p + offset

以下是指针行为的图解表示。 p是一个指向/保持backup地址的指针。因此p的地址为0x2000,但&p的地址为p 0x3000。因此,&p + offset会导致您的情况发生不同的内存位置。

   p                  backup              
+------+             +------+          
|      |             |      |                        
|0x2000|------------>|0x1000| 
|      |             |      |
+------+             +------+
 0x3000               0x2000 

也可以使用,

指针地址的

%p格式说明符。

答案 2 :(得分:2)

memcpy(backup, balance, sizeof(balance));
p = backup;

printf( "Array values using pointer\n");
for ( i = 0; i < 5; i++ ){
    //printf("*(p + %d) : %f\n",  i, *(p + i) );
    printf("p[%d] : %f\n",  i,  p[i]);
    printf("p[%d] : address: %p\n",  i,  (void*)(p+i));
}

int offset = 4;
printf("Contents of p[%d] : address: %p is %f\n",  offset,  p+offset, p[offset]);
double* newPointer;
newPointer = p+offset;
printf("The content again: %f at address: %p\n",  *newPointer, newPointer);