当声明字符串时,可以这样写:
char *mypointerorarray[] = {"string1", "string2", "string3"};
这是指向多个数组的指针还是指向字符串的指针数组?
另外,我该如何将其从内存中删除?
这是一个指向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
、j
和 k
的生命周期仅限于循环,只有 x
和 y
在整个函数中具有生命周期。然而,我熟悉的所有实现都会在函数进入时为 x
、y
、i
、j
、k
和 arr
分配内存,并保持到函数退出。
char *mypointerorarray[] = {"string1", "string2", "string3"};
上述声明是字符指针数组。这意味着在这种情况下,您将获得三个字符指针,每个指针都指向相应的字符串字面值。即 char *mypointerorarray[0] -> "string1",char *mypointerorarray[1] -> "string2" 和 char *mypointerorarray[2] -> "string3"。
mypointerorarray
是一个包含 3 个指针的数组。然而,该数组的元素恰好指向字符串字面量的开头。每个字符串字面量本身都是一个数组。
你无法“从内存中删除它”,因为你一开始并没有分配它。根据 mypointerorarray
的定义位置不同,它将具有静态或自动存储期。一旦其存储期结束,它将自动从内存中删除。
char* mypointerorarray[]
可能更容易理解。 - Tim