char * name []指针数组或指向数组的指针?

时间:2013-01-08 20:40:30

标签: c arrays pointers

声明这样的字符串时:

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

这是指向多个数组的指针还是指向字符串的指针数组?

另外,我将如何从内存中删除它?

4 个答案:

答案 0 :(得分:4)

  1. 这是一个指向字符的指针数组
  2. 你根本没有从内存中删除它,因为没有分配动态内存。使用堆栈内存。

答案 1 :(得分:1)

这是指向char的指针数组。它将包含字符串文字"string1""string2""string3"地址

字符串文字的内存在程序启动时分配并保持到程序终止。

如果数组声明在任何函数之外(在文件范围内)或在函数或块中使用static关键字声明,那么它的内存(足以容纳3个指针值)也将是在程序启动时分配并保持直到程序终止。

如果数组是在函数或块中声明的,那么它的内存是在块条目上分配的,并在块退出时释放,从逻辑上讲;实际上,函数中的所有auto变量的内存都留在函数入口处,即使变量的生存期没有扩展到整个函数。例如,给定代码

void (foo)
{
  int x;
  int y;
  ...
  for (int i = 0; i < 100; i++)
  {
    int j;
    int k;
    ...
    if (condition())
    {
      char *arr[] = {"string1", "string2", "string3"};
      ...
    ]
    ...
  }
  ...
}

arr的生命周期仅限于内部if语句,ijk的生命周期仅限于循环,并且只有xy具有整个函数的生命周期。但是,我熟悉的所有实现都将为xyijk和{{1}分配内存在函数入口上保持它直到函数退出。

答案 2 :(得分:1)

mypointerorarray是一个由3个指针组成的数组。但是,此数组的元素恰好指向字符串文字的开头。每个字符串文字本身就是一个数组。

你不能“从内存中删除它”,因为你没有首先分配它。根据您mypointerorarray的定义位置,它将具有静态或自动存储持续时间。一旦存储持续时间结束,它将自动“从内存中删除”。

答案 3 :(得分:1)

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

上面的声明是字符指针数组。意味着在这种情况下,您将获得三个字符指针,每个指针指向相应的字符串文字。即   char * mypointerorarray [0] - &gt; “string1”,char * mypointerorarray [1] - &gt; “string2”和   char * mypointerorarray [2] - &gt; “STRING3”。