关于argc argv和env的混淆
Confusion about argc argv and env
我只是不知道如何准确地解释我的问题。所以我写了上面的标题。
这是我对一个非常简单的程序的困惑。没错,的结果是。
#include <iostream>
using namespace std;
char * tmp[]={"aaa", "bbb", "ccc"};//there are 3 members
int main(int argc, char* argv[], char* env[])
{
cout << sizeof(env)/sizeof(char*) << endl;
cout << sizeof(tmp)/sizeof(char*) << endl;
}
结果:1 3
我需要的是env[]的长度。我怎么可能得到env[]的1,而'tmp'(3)的长度是绝对正确的呢?
env的长度不可能是1,因为我测试过了,它的数字是47。
为什么会这样?谢谢!
区别在于tmp
是一个数组,而env
是一个指针。数组和指针是不同的。这有点令人困惑,因为函数形式参数列表中的数组语法实际上是一个伪装的指针。
无法通过sizeof
得到env
所指向的元素个数。您必须遍历它们,直到找到终止列表的NULL
元素。
重要的是要记住,argv
和env
是指针,而不是数组。在函数参数声明的上下文中,T a[]
和T a[N]
被解释为T *a
,因此argv
和env
的类型都是char **
,而不是char *[N]
。
确定每个元素指向多少个元素的唯一方法是遍历它们,直到找到一个NULL指针:
size_t i;
for ( i = 0; argv[i] != NULL; i++ )
; // empty loop body
printf( "There are %zu elements in argvn", i );
for ( i = 0; env[i] != NULL; i++ )
; // empty loop body
printf( "There are %zu elements in envn", i );
C语言有一些语法特性,对有经验的程序员来说很方便,但对初学者来说却很困惑。虽然语法T * X[]
在这两种情况下看起来是一样的,但它们实际上意味着两个非常不同的东西:
-
int a[] = { 1, 2, 3};
与int a[3] = { 1, 2, 3 };
相同。这里a
是一个数组,数组的大小是从初始化器中推导出来的。 -
void f(int b[])
与void f(int * b)
相同。这里b
是一个指针,它的表示法仅仅暗示了这样一个事实,即应该使用指向数组元素的指针来调用f
。例如,您可以调用f(a)
,或者等价的f(&a[0])
,甚至f(a + 2)
。但是声明器语法纯粹是为了美观方便,而且b
不是数组,而是指针。
这与这些是main的参数没有什么关系,sizeof
任何东西都是编译时表达式。显然,传递给程序的环境和参数不是。sizeof(array)/sizeof(element_type)
仅在用静态大小声明数组时才表示该数组的长度。否则,sizeof(array)
将等同于sizeof(element*)
(并且因为sizeof(char**) == sizeof(char*)
您在程序中得到1
)。
- boost::p rocess::env 在 ubuntu 19.04 上坏了?
- 为什么 Xcode 无法识别 argc?
- 禁用/重命名从主机环境导入"env"
- 为什么argc的输出会有所不同?
- 视频捕获与" int main(int argc, char **argv) "
- ApplellVM 9.1.0具有C 17支持?还是CMAKE/ENV问题
- "if (argc < 2 || argc > 2)"应该有 2 个参数吗?&终止在抛出'std::out_of_range'错误实例后调用
- 如何设置我的dll加载,该dll取决于Env-ailiable的某些第三部分DLL
- 为什么现代C 仍然保留旧的C样式原型,用于int argc,char ** argv
- 将ARGV和ARGC传递给Main作为数组
- 带有 argc 和 argv 的素数
- 将 argc 和 argv 传递给 QApplication 到单元测试用例方法中
- 无论如何,在我的主文件之外传递 argc、argv .cpp
- Emscripten 链接静态库错误:wasm 流式编译失败:导入'env.getTempRet0'
- Qapplication中没有成员ARGC和ARGV
- 函数main中的参数argv(int argc,char *argv [])
- C++ (int getopt(argc, (char **)argv, optstring)
- 如何从 ARGC 读取文件
- C++ 从节点模拟 int main(int argc, char *argv[])
- 关于argc argv和env的混淆