指针数组没有给出正确的输出
Array of pointer not giving proper output as it suppose?
嗨,我有一个两个指针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的地址
- 使用递归输出数组
- C++ 输出数组中的最高元素
- 空指针(为缺少的输出数组调用的 create() 在 create,文件 /home/m/OpenCV/modules/
- C++ 为什么我会得到垃圾输出数组?
- C 默认如何输出数组
- 使用递归输出数组
- 从 VB6 调用的 C++ DLL 函数中的输出数组参数
- 递归函数,用于输出数组的最小数量
- 如何在 c++ 中水平输出数组
- 冒泡排序未正确排序或输出数组值
- 按相反顺序输出数组的元素
- 制作一个排列函数,输出数组中所有可能的排列
- OpenCV (c++)缝合器不写入输出数组
- 创建一个3x3x3阵列.用0到9之间的随机值填充.输出数组.找出3个最小值和3个最大值的输出
- 实现[B,C]=f(A)语法(函数f作用于具有两个或多个输出数组的数组)
- 双指针输出数组参数异常
- SWIG Python C++输出数组给出'unknown type'错误
- 以 XLL 为单位获取调用方定义的输出数组尺寸
- c++:如何从函数接收可变长度的输出数组
- 未定义的符号 输出数组 opencv fedora.