c++ - 指针数组没有像想象的那样给出正确的输出?

标签 c++ c arrays pointers

嗨,我有两个指针 int *p[2] 的数组,我正在尝试存储 3 个整数地址,让我们采用 &i、&j、&k ,如下代码在 *p[0]

我得到了垃圾,为什么这里是垃圾?它应该在 p[2] 处?在 *p[1] 我得到了值(value),这没关系,但是在 *p[2] 我在这里得到了值(value),我应该得到垃圾吗?

     #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 ? 
     }

最佳答案

printf("p[2]=%d\n",*p[2]); // here 30 why here ?

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

I am getting value here i should get garbage?

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

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

由于您写入k地址的内存不属于您的程序,系统可能会向其中写入一个新值。但是,它不会 100% 确定地执行此操作:它可能根本不会将新值写入该内存。这正是您的情况所发生的情况:写入 p[2]&k 值在两次调用 printf 后非法“存活” code>,生成 30 作为结果。

关于c++ - 指针数组没有像想象的那样给出正确的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25293936/

相关文章:

c - while ( ) 循环中的 "--"运算符

python - 多维数组上的 Numpy 直方图

c++ - QObject多重继承和operator new

c++ - 如何让 setw 应用于以下所有标准输出?

c++ - 未捕获从代码的特定部分抛出的异常

C++ - 移位返回负数

c - 调试时从寄存器中提取单个位

c - 是否有任何数据可以保存我在 WINAPI 中选择的过滤器 - OPENFILENAME

java - 在 Java 中对数组实例调用 hashCode()

Java 8 Lambda 将 Number[][] 转换为 double[][]