我有以下程序.
#include <stdio.h>
int main(int argc, char const * const argv[], char const * const * envp) {
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;
}
这将按照预期进行编译,不会出现任何警告.
如果我将envp指针改为常量,则将其声明更改为以下内容.
char const * const * const envp
则编译失败,如下所示.
$ gcc -Wall main.c
main.c: In function ‘main’:
main.c:9:45: error: increment of read-only parameter ‘envp’
9 | for (int i = 0; *envp != NULL; i++, envp++) {
|
这对我来说是有意义的:在这个程序中,我们可以声明每个环境字符串的(第一个也是唯一一个?)字符值是一个常量,我们可以声明每个指向每个环境字符串的指针都是常量,但我们不能声明char**envp是常量.
现在,我的问题是,我如何以类似的方式将数组变量argv
声明为常量,从而使argv
不能被重新赋值?
也就是说,我想以这样一种方式声明argv
:下面的代码将产生与上面的"read-only parameter ‘envp’"
错误类似的编译错误.我希望以下代码不能编译.按照原样,将编译以下代码.
#include <stdio.h>
int main(int argc, char const * const argv[], char const * const * envp) {
char const * const argvbad[1] = { NULL };
argv = argvbad; // I want this to be impossible
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;
}
这是一个关于一般数组变量的问题.我想学习如何将数组变量声明为常量,以便它们引用的数组不能重新赋值.