You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言指针无法正确读取数组元素问题求助

为什么你的指针访问会得到意外的垃圾值?

兄弟,你的问题核心是数组越界访问加上对指向数组的指针的运算逻辑理解不到位,咱们一步步拆解清楚:

先把你的代码格式化出来,方便咱们对着分析:

// ptr指向包含2个int元素的数组
int (*ptr)[2];
int torf[2][2] = {12, 14, 16};
ptr = torf;

int (*ptr_2)[2];
int torf_2[2][2] = { {12}, {14, 16}};
ptr_2 = torf_2;

printf("%d %d\n", **ptr, **(ptr + 2));
printf("%d %d\n", **ptr_2, **(ptr_2 + 2));

第一部分:torf数组与ptr指针的问题

你定义的torf[2][2] = {12,14,16};,C语言里二维数组初始化是行优先填充的——先填满第一行的2个元素,再填第二行。你只给了3个值,所以torf的实际内存布局是:

torf[0] = {12, 14}
torf[1] = {16, 0}  // 第四个元素未初始化,默认补0(局部变量可能是随机值,但逻辑上是越界前的最后一个有效元素)

而ptr是指向int[2]类型的指针,也就是它指向二维数组的一整行。指针运算时,ptr + n的偏移量是n * sizeof(int[2]),简单说就是跳过n行。你的torf只有2行,有效行下标是0和1,ptr + 2直接指向了torf数组后面的未知内存区域——这属于数组越界访问,是C语言里的未定义行为,得到6422000这种随机垃圾值完全正常,因为你在访问不属于数组的内存。

第二部分:torf_2数组与ptr_2指针的问题

再看torf_2[2][2] = { {12}, {14,16}};,这个初始化的内存布局是:

torf_2[0] = {12, 0}  // 第一行只给了一个元素,第二个补0
torf_2[1] = {14, 16}

同样的道理,ptr_2 + 2也是越界访问,你得到12纯属于巧合——换个编译器、换个运行环境,结果可能是任何随机数,本质还是未定义行为。

怎么得到你期望的结果?

你想要的输出是12 16 12 14,说明你想访问的是torf的第二行第一个元素,以及torf_2的第二行第一个元素。那只要把+2改成+1就行(因为行下标从0开始,第二行是下标1):

修正后的代码:

#include <stdio.h>

int main() {
    // ptr指向包含2个int元素的数组
    int (*ptr)[2];
    int torf[2][2] = {12, 14, 16};
    ptr = torf;

    int (*ptr_2)[2];
    int torf_2[2][2] = { {12}, {14, 16}};
    ptr_2 = torf_2;

    printf("%d %d\n", **ptr, **(ptr + 1));
    printf("%d %d\n", **ptr_2, **(ptr_2 + 1));
    return 0;
}

运行这段代码就能得到你期望的12 16 12 14了。

最后再划几个重点

  • 指向数组的指针,+n是跳过n个它指向的数组类型,比如int(*p)[2],p+1会移动2个int的大小,对应二维数组的下一行。
  • 二维数组的行数是你定义的[2][2],所以有效行下标只有0和1,超过这个范围就是越界,结果完全不可预测。
  • 二维数组初始化时,未指定的元素会默认补0(全局/静态变量)或随机值(局部自动变量)。

内容的提问来源于stack exchange,提问作者Matsu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:12:30