C语言中传递数组至函数并通过printf逐字符打印的正确方法
C语言数组传递与逐字符printf输出的正确方式
首先来说说你遇到的段错误问题:你提到尝试用printf()直接解引用单个数组值导致错误,这大概率是因为你写了类似printf("%c", *array[0]);这种代码——array[0]本身就是'a'这个字符值,你再对它解引用*,相当于把字符的ASCII值(比如97)当成内存地址去访问,这肯定会触发段错误,因为这个地址不属于你的程序内存空间。
接下来解决核心问题:在函数里定义的数组,怎么传递到循环里逐字符引用打印?其实C语言里数组传递有个关键特性——数组作为函数参数时会自动退化为指向首元素的指针,我们可以利用这个特性来传递,同时要注意必须手动传递数组长度(因为指针本身不知道它指向的内存块有多大)。
完整代码示例
这里给你写一个可运行的完整例子,包含数组定义、传递和打印的全过程:
#include <stdio.h> // 定义专门的打印函数:接收字符指针和数组长度 void printArray(const char *arr, int length) { for (int i = 0; i < length; i++) { // 方式1:用下标访问,直观易懂 printf("%c ", arr[i]); // 方式2:用指针算术访问,和上面完全等价 // printf("%c ", *(arr + i)); } printf("\n"); } void arrayFunc() { char array[5]; array[0] = 'a'; array[1] = 'b'; array[2] = 'c'; array[3] = 'd'; array[4] = 'e'; // 传递数组名(自动转为指向首元素的char*)和数组长度5 printArray(array, 5); } int main() { arrayFunc(); return 0; }
关键知识点解释
- 数组传递的本质:当你把
array传给printArray时,它不再是数组类型,而是变成了char *指针,指向数组的第一个元素array[0]。这也是为什么我们可以用*(arr + i)来访问第i个元素——指针加上偏移量i,就指向了第i个元素的地址,解引用后就是对应的值。 - 必须传递数组长度:因为指针本身没有长度信息,如果不传递长度,循环就不知道什么时候停止,很容易越界访问内存,再次触发段错误或者其他未定义行为。
- 正确的元素引用方式:不管是用下标
arr[i]还是指针算术*(arr + i),都能直接拿到数组元素的值,不需要额外的解引用操作——这就是你之前出错的核心原因,多做了一次不必要的*操作。
简化版:直接在定义数组的函数里打印
如果不需要把数组传递到其他函数,直接在arrayFunc里循环打印也可以,代码更简单:
#include <stdio.h> void arrayFunc() { // 也可以直接初始化数组,更简洁 char array[5] = {'a', 'b', 'c', 'd', 'e'}; for (int i = 0; i < 5; i++) { printf("%c ", array[i]); } printf("\n"); } int main() { arrayFunc(); return 0; }
内容的提问来源于stack exchange,提问作者z.rubi
相关产品推荐
相关产品推荐

