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
相关产品推荐
相关产品推荐

