我只是不知道如何准确地解释我的问题。所以我在上面写了这个标题。
这是我对一个非常简单的程序的困惑。确切地说,结果。
#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.
为什么会这样? 谢谢!
答案 0 :(得分:5)
不同之处在于tmp
是一个数组,而env
是一个指针。数组和指针是不同的。它有点令人困惑,因为array syntax in a function formal parameter list is actually a pointer in disguise。
无法使用env
获取sizeof
指向的元素数量。您必须仔细检查它们,直到找到终止列表的NULL
元素。
答案 1 :(得分:1)
要记住的重要一点是argv
和env
是指针,而不是数组。在函数参数声明的上下文中,T a[]
和T a[N]
被解释为T *a
,因此argv
和env
的类型都是{{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
。