char *name[]是指针数组还是数组指针?

3

当声明字符串时,可以这样写:

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

这是指向多个数组的指针还是指向字符串的指针数组?
另外,我该如何将其从内存中删除?

2
这是一个指针数组。 - cnicutar
请访问cdecl.org - Barmar
1
这种表示法 char* mypointerorarray[] 可能更容易理解。 - Tim
4个回答

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

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 在整个函数中具有生命周期。然而,我熟悉的所有实现都会在函数进入时为 xyijkarr 分配内存,并保持到函数退出。


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

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


1

mypointerorarray 是一个包含 3 个指针的数组。然而,该数组的元素恰好指向字符串字面量的开头。每个字符串字面量本身都是一个数组。

你无法“从内存中删除它”,因为你一开始并没有分配它。根据 mypointerorarray 的定义位置不同,它将具有静态或自动存储期。一旦其存储期结束,它将自动从内存中删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接