字符串数组和char **环境变量

时间:2011-01-17 12:46:32

标签: c arrays pointers

我想知道如何声明字符串数组?我所做的是声明一个指向字符串指针的数组。例如

char *array[]= {"string1","string2","string3"};

我正在阅读有关在Linux中修改环境变量的信息,并偶然发现指针char ** environ(http://www.cs.bham.ac.uk/resources/courses/2005/17423/doc/libc/Environment-Access.html#Environment-Access)。

char ** environ被声明为字符串数组。我认为它应该是一个指针指针。例如。

char *array[]= {"string1","string2","string3"};
 environ = array;

我做错了吗?

我还在某处读过char *argv[] = char **argv.怎么可能?

编辑:我也发现这个帖子非常有帮助。 Should I use char** argv or char* argv[] in C?

3 个答案:

答案 0 :(得分:1)

问题就是这个问题。在你的程序中有几个指针。一个指向一个字符串数组,另一个称为environ指向环境变量。你用C environ = array对C语言给出的值与数组相同,但是数组有一个指向本地数组的指针。因此,在该语句之后,environ指针将指向您所创建的数组,但未对其先前的内容进行任何更改。

我认为你需要将数组的所有元素strcpy到environ。或者使用api调用setenv(我认为是)

和你的第二个问题。是的,第一对[]总是可以重写为指针。所以array [] = *数组为array[][5] = (*array)[5]*array[] = **array

我希望能帮助你。

答案 1 :(得分:1)

你正在混淆两个不同的东西,实际上对于正在学习的人来说很难知道。函数内部的变量声明和函数参数不是一回事。等价

char*argv[] ~~~ char **argv

成立,因为这是一个参数(main)。在那里,数组实际上与声明指针一样。

您的作业environ = array没有错,从语法上讲,编译器会接受它。但由于以下几个原因,它在语义上是错误的:

  • 你不知道是谁以及如何 已分配*environ
  • 你松开了对它的引用 初始内容*eviron
  • 您将分配一个本地存储 离开示波器后再循环使用 功能。所以*environ会 一旦你离开了,就不确定了 功能

所以environ是做这样一个任务的一个特别糟糕的例子。

答案 2 :(得分:1)

在C中,字符串基本上只是一个字符数组。另外,数组名称也代表其地址。

这就是为什么argv []是字符数组的地址(这是一个字符串),而* argv也是字符串的地址(因为它是第一个字符的地址)。