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

Array of pointer not giving proper output as it suppose?

本文关键字:输出 数组 指针      更新时间:2023-10-16

嗨,我有一个两个指针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]=%dn",*p[0]); // why garbage here ?         
        printf("p[1]=%dn",*p[1]); // here 20 
        printf("p[2]=%dn",*p[2]); // here 30 why here ? 
     }

printf("p[2]=%dn",*p[2]);//这里30为什么在这里?

因为p有两个元素,而不是三个。您可以访问元素0和1,但访问元素2是未定义的行为。任何数字都可以打印,否则当您调用未定义的行为时,程序可能会崩溃。

我在这里得到价值,我应该得到垃圾?

30和其他数字一样都是垃圾值。

**EDIT(回答这个问题的编辑)当你分配p[2] = &k时,你写的是一个没有分配给你的程序的位置。但是,如果写操作完成而没有崩溃,则新值将保留在内存中。

由于您写入k地址的内存不属于您的程序,系统可能会向其中写入一个新值。然而,它不会100%确定:它可能根本不会向内存中写入新值。这正是在您的案例中发生的情况:写入p[2]&k的值在两次调用printf之后非法"幸存"下来,结果产生30

您使用的是int *p[2],它是一个大小为2的数组。只有p[0]p[1]有效。记住,c++中数组的下标从0开始,而不是1。使用p[2]会得到一些奇怪的结果。

你有两个指针的数组int *p[2]。但是您正在尝试使用指针打印下一个元素-

printf("p[2]=%dn",*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# 

首先你需要

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的地址