0

下面的两个函数之间是否有任何区别不是在两种情况下都返回局部变量的地址,而是使用 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

3 回答 3

6

它们之间存在差异:

  1. 第一个返回int *值为 4 的 an,注意它不是指向值为 4 的变量,而是指向地址 4。
  2. 第二个返回一个指向一个包含 4 的变量的指针,但实际上,这个指针是无效的,因为它指向一个已经返回函数的局部变量,任何使用它都会导致未定义的行为。
  3. 第三个返回一个指向 char 的指针(根据定义),但实际上这是一个指向字符串文字的指针(通过实现)。它的问题在于,作为函数 returnchar *而不是const char *,人们可能会尝试修改返回缓冲区,这将再次导致未定义的行为。
于 2012-05-07T11:36:07.887 回答
1
  • f1将值 4 转换为地址,实际上指向内存中的某个位置。
  • f2返回局部变量的地址。取消引用此指针将是未定义的行为。
  • f3是指向字符串文字的指针。这是一个有效的指针,因为字符串文字的生命周期与程序生命周期(静态存储持续时间)相同。该文字的确切存储位置由实现定义。操作字符串文字的内容是未定义的行为。
于 2012-05-07T11:37:32.420 回答
0
  • f1您已明确指定地址4并返回相同而不是该地址的值。
  • 局部变量是在堆栈上分配的,因此在f2您返回的位置&a,您返回的是堆栈上的地址,而不是4内存中该地址处的地址。取消引用此地址会导致未定义的行为,因为函数会从堆栈中清除。
  • 字符串字面量分配在只读数据部分并注意两者之间的区别

    char arr[]="abcd";char *ptr="abcd";

    第一个是字符数组,分配在堆栈上,而第二个是指向字符串字面量的指针(字面量不是指针),分配在只读数据段上。

PS:我在这里假设 GCC/x86。

于 2012-05-07T11:55:12.490 回答