字符串常量存储

grv*_*grv 0 c

以下两个函数之间是否存在任何差异,两种情况都不是返回局部变量的地址,而是使用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;
}
Run Code Online (Sandbox Code Playgroud)

MBy*_*ByD 6

所有这些之间都存在差异:

  1. 第一个返回int *值为4的值,注意它不指向值为4的变量,而是指向地址4.
  2. 第二个返回一个指向一个包含4的变量的指针,但实际上,这个指针无效,因为它指向已经返回的函数的局部变量,并且对它的任何使用都将导致未定义的行为.
  3. 第三个返回指向char的指针(根据定义),但实际上这是一个指向字符串文字的指针(通过实现).它的问题是,当函数返回char *而不是const char *,可能会尝试修改返回缓冲区,这将再次导致未定义的行为.