下面两个函数之间有什么区别不是在两种情况下都返回局部变量的地址,而是使用 f1() fn 返回正确的值 4 而不是 f2()。同样在第三种情况下,字符串常量没有存储在堆栈中,所以当我们返回指针时,它会正常工作。那么字符串常量存储在哪里?
int* f1()
{
int* a=(int*)4;
return a;
}
int* f2()
{
int a=4;
return &a;
}
char* f3()
{
char* p="abcd";
return p;
}
最佳答案
它们之间存在差异:
- 第一个返回一个值为4的
int *
,注意它不是指向一个值为4的变量,而是指向地址4。 - 第二个返回一个指向包含 4 的变量的指针,但实际上,这个指针是无效的,因为它指向一个已经返回的函数的局部变量,任何使用它都会导致未定义的行为。<
- 第三个返回一个指向 char 的指针(根据定义),但实际上这是一个指向字符串文字的指针(根据实现)。它的问题在于,由于函数返回
char *
而不是const char *
,可能会尝试修改返回缓冲区,这将再次导致未定义的行为.
关于c - 字符串常量存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10481326/