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

为什么C语言函数内给传入的字符指针赋值为NULL不生效?

问题原因解析

1 核心原因:C语言函数值传递规则

你代码中printf没有执行的本质是C语言的函数参数默认采用值传递:

  • 调用calling(str2)时,会把str2(数组首元素地址)拷贝一份传给calling的形参str,形参str是和原str2完全独立的临时变量
  • calling中执行str = NULL仅修改了这个临时变量的取值,不会对外部main函数中的str2产生任何影响,因此str2 == NULL的判断永远不成立。

2 补充:数组名本身不可修改指向

你的另一个疑问「是否字符数组声明后就不能将其对应的指针修改为NULL」答案是肯定的:

  • 数组名本质是常量指针,属于不可修改的左值,哪怕你直接在main函数中写str2 = NULL,也会直接编译报错,不存在任何修改数组名指向的合法操作。

逻辑等价对比

你写的代码逻辑和下面的代码完全等价,可以更直观看出问题:

int main()
{
    char str2[20];
    // 模拟函数传参的拷贝动作
    char *temp = str2;
    temp = NULL; // 仅修改临时变量,和str2无关

    if(str2 == NULL)
    {
        printf("null");
    }
    return 0;
}

如果你需要修改外部指针的指向(仅针对指针变量有效)

如果你的场景用的是可修改的指针变量而非数组,需要传二级指针才能修改外部指针的取值,示例如下:

void calling (char **str)
{
    *str = NULL;
}

int main()
{
    // 注意这里是指针变量,不是数组,可修改指向
    char *str2 = malloc(20);
    calling(&str2);

    if(str2 == NULL)
    {
        printf("null"); // 此处会正常执行
    }
    free(str2);
    return 0;
}

内容的提问来源于stack exchange,提问作者C-ode Menon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 05:39:03