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

C语言char指针数组传入函数打印输出NULL问题排查求解

问题根因
  • 函数形参类型不匹配:你定义的names是char*类型数组,每个元素都是指向字符串的字符指针,但是printNames的形参声明为char arr[],该类型在函数传参时会自动退化为char*(指向单个字符的指针),和实参names的实际类型(数组名传参时退化为char**,指向字符指针的指针)完全不匹配,属于基础类型错误,访问逻辑自然无法得到预期结果。
  • 指针偏移步长错误:由于形参arr被识别为char*类型,arr + i的偏移步长是1字节(char类型的长度),而你实际需要的偏移步长是一个指针的长度(32位系统为4字节、64位系统为8字节),偏移量错误导致读取到的内容根本不是原数组存储的字符串首地址,因此输出异常。
修复方案

只需要调整printNames的形参类型为char* arr[](等价于char** arr)即可,修复后的完整代码如下:

#include <stdio.h>

// 形参修改为char*类型的数组,和传入的实参类型匹配
void printNames(char* arr[], int size);

int main()
{
    char *names[4] = {"Bruce", "Clark", "Barry", "Diana"};

    for(int i = 0; i < 4; i++)
    {
        printf("%s ", *(names + i));
    }
    printf("\n");

    printNames(names, 4);

    return 0;
}

void printNames(char* arr[], int size)
{
    for(int i = 0; i < size; i++)
    {
        printf("%s ", *(arr + i));
    }
}
补充说明

C语言中除了sizeof、取地址&等少数场景外,数组名在传参时都会退化为指向数组首元素的指针:char* names[4]的首元素是char*类型,所以传参后得到的是char**类型的指针,形参必须对应声明为char**或者char* arr[](数组形式的形参会被编译器自动调整为对应的指针类型)。
日常开发时建议开启编译器告警(比如gcc编译时添加-Wall参数),这类类型不匹配的问题在编译阶段就会被告警提示,可提前排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:15:03