如何在C语言中将数组变量声明为常量以禁止重赋值?
如何让函数参数中的数组形参无法被重赋值
在C语言里,函数参数里的数组声明本质是指针的语法糖——T argv[]会被编译器直接解析成T *argv。要是想禁止这类形参被重赋值,得给指针本身加上顶层const限定符,把它变成不能修改的常量指针。
针对你的argv声明需求
你现在用的char const * const argv[],编译器实际会把它当成char const * const * argv——这里的argv是个可以修改的指针,能指向其他数组。要阻止argv = argvbad;这种赋值操作,就得给指针本身加const,改成:
char const * const * const argv
修改后的完整代码如下:
#include <stdio.h> int main(int argc, char const * const * const argv, char const * const * envp) { char const * const argvbad[1] = { NULL }; argv = argvbad; // 此时编译会报错:赋值只读变量‘argv’ for (int i = 0; i < argc; i++) { printf("argv[%d]: %s\n", i, argv[i]); } printf("\n"); for (int i = 0; *envp != NULL; i++, envp++) { printf("envp[%d]: %s\n", i, *envp); } return 0; }
编译这段代码时,编译器会抛出类似“assignment of read-only parameter ‘argv’”的错误,刚好达到禁止重赋值的目的。
对比envp的情况
之前你把envp声明成char const * const * const envp时编译报错,原因是envp++试图修改这个常量指针本身——顶层const限定了指针变量不能被修改,不管是直接赋值还是自增操作都会被编译器拦截。
通用问题解答:如何让数组变量无法被重赋值
分两种场景处理:
- 局部/全局数组变量:真正的数组变量(比如
int arr[5];)本身就不能被赋值,直接写arr = another_arr;会触发编译错误,不需要额外加const。 - 函数参数中的数组形参:因为会退化为指针,必须给指针加顶层const(比如
T * const param,或者根据实际类型调整的多层const组合),才能禁止对该指针的重赋值。
内容的提问来源于stack exchange,提问作者ioyq2d8s
相关产品推荐
相关产品推荐

