关于argc argv和env的困惑

时间:2014-05-28 15:25:50

标签: c++ environment argv

我只是不知道如何准确地解释我的问题。所以我在上面写了这个标题。

这是我对一个非常简单的程序的困惑。确切地说,结果

#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.

为什么会这样? 谢谢!

4 个答案:

答案 0 :(得分:5)

不同之处在于tmp是一个数组,而env是一个指针。数组和指针是不同的。它有点令人困惑,因为array syntax in a function formal parameter list is actually a pointer in disguise

无法使用env获取sizeof指向的元素数量。您必须仔细检查它们,直到找到终止列表的NULL元素。

答案 1 :(得分:1)

要记住的重要一点是argvenv指针,而不是数组。在函数参数声明的上下文中,T a[]T a[N]被解释为T *a,因此argvenv的类型都是{{1} },而不是char **

确定每个指向的元素数量的唯一方法是迭代它们直到找到NULL指针:

char *[N]

答案 2 :(得分:1)

语言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 不是数组,而是指针。

答案 3 :(得分:0)

这与main的参数几乎没有关系,sizeof任何东西都是编译时表达式。显然,传递给你的程序的环境和论点都不是。 sizeof(array)/sizeof(element_type)只是数组的长度,如果该数组是以静态大小声明的。否则,sizeof(array)将等同于sizeof(element*)(因为sizeof(char**) == sizeof(char*)会在您的计划中获得1