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

