嗨我有两个指针int * p [2]的数组,我试图存储3个整数地址让我们& i,& j,& k如下面的代码At * p [0]
我得到垃圾为什么这里有垃圾?它应该在p [2]?在* p [1]我得到的价值是可以的但是在* p [2]我在这里得到价值我应该得到垃圾吗?
#include<stdio.h>
int main()
{
int i=10,j=20,k=30;
int *p[2]; // here p is array of 2 pointers
p[0]=&i; // but here i am storing
p[1]=&j; // 3 address of variable i,j,k
p[2]=&k;
printf("p[0]=%d\n",*p[0]); // why garbage here ?
printf("p[1]=%d\n",*p[1]); // here 20
printf("p[2]=%d\n",*p[2]); // here 30 why here ?
}
答案 0 :(得分:5)
printf("p[2]=%d\n",*p[2]);
//这里30为什么在这里?
因为p
有两个元素,而不是三个元素。您可以访问元素0和1,但访问2是未定义的行为。可以打印任何数字,或者在调用未定义的行为时程序可能会崩溃。
我在这里得到的价值我应该得到垃圾吗?
30与任何其他数字一样好。(
) **编辑(响应问题的编辑)当您指定p[2] = &k
时,您写入未分配给您的程序的位置。但是,如果写操作在没有崩溃的情况下完成,则新值将保留在内存中。
由于您写入地址k
的内存不属于您的程序,因此系统可能会在其中写入新值。但是,它不会100%确定地执行它:它可能根本不会在该内存中写入新值。这正是您的案例中似乎正在发生的事情:&k
非法写入p[2]
的价值&#34;幸存&#34;过去两次printf
的调用,结果生成30
。
答案 1 :(得分:0)
您正在使用int *p[2]
,这是一个大小为2的数组。只有p[0]
和p[1]
有效。记住c ++中数组的索引从0开始而不是1.使用p[2]
最终会有一些奇怪的东西。
答案 2 :(得分:0)
你有两个指针int *p[2]
的数组。但是你试图用指针 -
printf("p[2]=%d\n",*p[2]);
导致未定义的行为。任何事情都可能发生。但是有时你会得到30
垃圾值。
对于我的计划 -
root@ubuntu:~/c/array/string# ./a.out
p[0]=10
p[1]=20
p[2]=-13543595 // note this value. Undefined Behaviour
root@ubuntu:~/c/array/string#
答案 3 :(得分:0)
首先你需要
int *p[3].
其次,因为你使用了
int *p[2]
对于这个阵列,p [2]并没有被放在一边。那么p [2]那里有什么?在我的情况下,它是变量k。
我的是64位系统,64位指针。
我的输出
p[0]=10
p[1]=20
p[2]=32767
并查看gdb转储,尤其是k和p [2]
的地址(gdb) p p[0]
$7 = (int *) 0x7fffffffe02c
(gdb) p p[1]
$8 = (int *) 0x7fffffffe028
(gdb) p p[2]
$9 = (int *) 0x7fffffffe024
(gdb) p &i
$10 = (int *) 0x7fffffffe02c
(gdb) p &j
$11 = (int *) 0x7fffffffe028
(gdb) p &k
$12 = (int *) 0x7fffffffe024
(gdb) p &p
$14 = (int *(*)[2]) 0x7fffffffe010
(gdb) x/32 0x7fffffffe010
0x7fffffffe010: -8148 32767 -8152 32767
0x7fffffffe020: -8156 32767 20 10
在你的情况下,它一定是i的地址。