声明这样的字符串时:
char *mypointerorarray[] = {"string1", "string2", "string3"};
这是指向多个数组的指针还是指向字符串的指针数组?
另外,我将如何从内存中删除它?
答案 0 :(得分:4)
答案 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
语句,i
,j
和k
的生命周期仅限于循环,并且只有x
和y
具有整个函数的生命周期。但是,我熟悉的所有实现都将为x
,y
,i
,j
,k
和{{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”。