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

C语言如何用指针访问字符串多维数组?代码运行异常排查

代码问题分析

核心错误1:数组指针类型不匹配

你定义的数组指针char (*ptr)[4]指向的是长度为4的char数组,但原二维数组some的行维度是[5],即每行是长度为5的char数组。这会导致指针偏移步长错误:

  • 指针做+1运算时,偏移长度为指向类型的大小,也就是ptr+1实际只会偏移4个字节,无法跳到下一行的起始位置,所以访问到的是错位的内存数据,产生乱码。
  • 偏移量累计后甚至会访问到数组边界外的内存,触发段错误。

核心错误2:元素访问语法错误

你对字符的访问写法不符合指针运算规则:

  • 比如*(ptr+1)+1的类型是char*,是内存地址,直接用%c输出地址值必然得到乱码,你需要对地址解引用才能拿到对应位置的char值。

正确的多维数组指针访问方式

1. 修正指针定义

首先要保证数组指针的指向类型和二维数组的行维度完全匹配:

char (*ptr)[5] = some; // 指向长度为5的char数组,和some的行维度一致

此时ptr+1会正确偏移5个字节,刚好跳到下一行的起始地址。

2. 访问规则

等价于var[i][j]的指针写法是*(*(ptr + i) + j),不同场景的写法如下:

  • 打印第i行的完整字符串:printf("%s\n", *(ptr + i));
  • 打印第i行第j个字符:printf("%c\n", *(*(ptr + i) + j));
  • 也可以直接用下标写法:ptr[i][j],C语言中下标语法和上述指针运算完全等价。

修正后的完整代码
int main() {
    char some[3][5] = {"Hi","Bye","Why?"};
    char (*ptr)[5] = some; // 修正指针类型
    printf("%s\n",some[0]);
    printf("%s\n",some[1]);
    printf("%s\n\n",some[2]);
    printf("%s\n",*(ptr)); // 输出Hi
    printf("%s\n",*(ptr+1)); // 输出Bye
    printf("%c\n",*(*(ptr+1)+1)); // 输出y(Bye的第二个字符)
    printf("%c\n",*(*(ptr+2)+2)); // 输出y(Why?的第三个字符)
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:39:00