c - 字符串常量存储

标签 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;
}

最佳答案

它们之间存在差异:

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

关于c - 字符串常量存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10481326/

相关文章:

c - C 结构中对齐填充的平台特定位置

c++ - rpcgen-在结构中传递字符串

C 结构指针 - 如何从模块返回结构指针?

c - 具有非阻塞输入和 fork 的 Ncurses

c - 如何在 C 中编写 pragma

c - 将地址作为符号加载到通用寄存器中

c - 这段代码有什么区别?

c - (void*) ptr == ptr 总是为真吗?

c - Raspberry Pi - 通过 PCF8574 IOExpander 连接基于 HD44780 的 20x4 LCD

c - SCTP回显服务器代码: Byteorder warning messages