指针数组没有给出正确的输出?

时间:2014-08-13 18:49:52

标签: c++ c arrays pointers

嗨我有两个指针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 ? 
     }

4 个答案:

答案 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的地址。