抱歉,如果这里已经发布了类似的内容,但我真的找不到。
我有以下代码,即使我会说这不正确,我也会收到正确的答案。
char *selectStr(int index){
char *str[] = {
"hello",
"hola",
"epa",
"alright",
};
return str[index];
}
int main() {
printf("String: %s\n", selectStr(2));
return 0;
}
谁能告诉我为什么这实际上有效?我看到它的方式:字符串数组str
是 selectStr 函数内的局部变量。此函数返回包含在此数组中的字符串。但是由于这个字符串数组str
是一个局部变量,它应该在它返回后从内存中清除(对吗?),所以我期待得到某种内存访问错误。
我应该认为自己很幸运这段代码可以工作(即这是一个未定义的行为吗?)或者这实际上是一种很好的做事方式(在这种情况下,为什么)?
我的猜测是,在函数返回后,指向数组的指针str
会被清除,但它指向的实际内容不会被清除,它会一直保留在内存中,直到有其他内容写入它为止。如果有人能证实这一点,或者告诉我实际发生了什么,我将不胜感激。
提前致谢!
PS:我会这样做的方式是将缓冲区作为参数传递,但我只是想知道为什么,令人惊讶的是——至少对我来说——这确实有效。