一个地址有两个值?

时间:2015-12-05 09:16:20

标签: c pointers

以下代码告诉我,对于一个地址,我有两个值。举个例子:

Address is: 0xbfcca1ac <br>
Value is: 5

Address is: 0xbfcca1ac <br>
Value is: -1077108308

我做错了什么?

#include <stdio.h>

void Input(int *A, int n) {

int i, x=5;

for(i=0; i<n*n; i++) {
   *(A+i) = x;
}

printf("\n\n\n\nAddress is: %p\n", A);
printf("Value is: %d\n", *A);

}

main() {

int A[3][3], i, j, n=3;

Input(A, n);

printf("\nAddress is: %p\n", A);
printf("Value is: %d", *A);
return 0;
}

3 个答案:

答案 0 :(得分:3)

main()中,A是一个二维数组,因此*A是一个包含3个整数的数组。使用*A格式打印%d会产生未定义的行为,因为*A不是int。

Input()中,A是指向int的指针,因此其值被视为int的地址。 *A就是int的值,假定它位于该地址。

main()传递给Input()的值为A[0]的地址。它有类型&#34;指向3 int&#34;的数组,但恰好等于(main()&A[0][0]

编译器将(如果配置正确)给出关于代码的警告,因为它将值传递给那些函数期望的不同类型的函数。由于类型不匹配(函数期望一种类型的参数,但被给予另一种类型)存在(至少)未定义行为的可能性,因此您不应忽略此类警告。即使你以某种方式能够推断正在发生的事情。

答案 1 :(得分:0)

试试这个:

#include <stdio.h>

typedef int int_of_three[3];
//Another way of saying int_of_three is int[3]

void Input(int_of_three A[3], int n) //int_of_three *A should also be fine
                                     //provided you play by the limits.
  {

     int i, x=5;
        for(i=0; i<n*n; i++) 
        {
         *(*(A+i)) = x;
        }

          printf("\n\n\n\nAddress is: %p\n", *A);
          // *A decays to another pointer.
          printf("Value is: %d\n", **A);
          printf("\nAddress is: %p\n", *(A+1));
          printf("Value is: %d", *(*(A+1)));


   }

main() 
{

int_of_three A[3];
int n=3;
    Input(A, n);
    printf("\nAddress is: %p\n", *A);
    printf("Value is: %d", **A);
    printf("\nAddress is: %p\n", *(A+1));
    printf("Value is: %d", *(*(A+1)));

return 0;
}

答案 2 :(得分:0)

打印值时,您只需在main中出错。由于A是指向int的指针,因此您应该:printf("Value is: %d",**A);(双重取消引用)。

编译器应该在传递参数时警告您不兼容的类型,强制转换会使编译器保持沉默:Input((int *)A,n);

同样使用main ...

的正确原型