3

像这样声明字符串时:

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

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

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

4

4 回答 4

4
  1. 这是一个指向字符的指针数组
  2. 您根本不会从内存中删除它,因为没有分配动态内存。使用堆栈内存。
于 2013-01-08T20:42:20.753 回答
1

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

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

于 2013-01-08T23:13:28.887 回答
1
char *mypointerorarray[] = {"string1", "string2", "string3"};

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

于 2013-01-09T05:49:22.773 回答
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语句, 、 和 的生命周期i仅限jk循环,并且仅xy具有整个函数的生命周期。但是,我熟悉的所有实现都会在函数入口处为xyijk和分配内存arr并保留它直到函数退出。

于 2013-01-08T22:54:28.933 回答