像这样声明字符串时:
char *mypointerorarray[] = {"string1", "string2", "string3"};
这是指向多个数组的指针还是指向字符串的指针数组?
另外,我将如何从内存中删除它?
mypointerorarray
是一个由 3 个指针组成的数组。但是,该数组的元素恰好指向字符串文字的开头。每个字符串文字本身就是一个数组。
您不能“从内存中删除它”,因为您一开始没有分配它。根据mypointerorarray
定义的位置,它将具有静态或自动存储持续时间。一旦存储期限结束,它将自动“从内存中删除”。
char *mypointerorarray[] = {"string1", "string2", "string3"};
上面的声明是字符指针数组。意味着在这种情况下您将获得三个字符指针,每个指针都指向相应的字符串文字。即 char *mypointerorarray[0] -> "string1"、char *mypointerorarray[1] -> "string2" 和 char *mypointerorarray[2] -> "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
并保留它直到函数退出。