以下代码告诉我,对于一个地址,我有两个值。举个例子:
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;
}
答案 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
...