当前位置: 首页 > 知识库问答 >
问题:

const char*p="some_string"和const char[]="some_string"在内存分配方面的区别[重复]

邢俊悟
2023-03-14
const char *fun1()
{
    const char *a = "hello";
    return a;
}

const char *fun2()
{
    const char a[] = "hello";
    return a;
}

int main(int argc, char *argv[])
{
    printf("%s\n", fun1());
    printf("%s\n", fun2());
    return 0;
}

输出:

cpp:12:12: warning: address of local variable 'a' returned [-Wreturn-local-addr]
   12 |     return a;
      |            ^
passwords.cpp:11:16: note: declared here
   11 |     const char a[] = "hello";
      |                ^
hello
(null)

这两种分配字符串的方法有什么区别?我得到的是一个警告,而不是另一个?我知道当我们从函数返回时,局部变量会被破坏,但为什么fun1()不是这样呢?它是否在其他地方获得内存而不是堆栈?

共有1个答案

诸葛柏
2023-03-14

在您的例子中,fun1()中字符串的字节存在于静态内存中。在另一个函数中,初始化时字节从静态内存复制到堆栈上的缓冲区。访问从fun2()返回的字符串是未定义的,因为堆栈上的数组不再存在。

fun1()可以重写为

const char fun1()
{
    static const char s[] = "hello";
    const char* a = s;
    return a;
}

fun2()可以重写为

const char fun2()
{
    static const char s[] = "hello";
    const char a[6]; // stack allocation (5 letters + 1 zero terminator)
    strcpy(a, s);
    return a; // UB: return pointer to local automatic array
}

因此,得到警告的主要原因是调用后fun2()中的数组不存在。将指针返回堆栈帧,与以下代码有相同问题的方式相同:

struct S { int x, y; };

struct S* fun1()
{
    static struct S s = { 10, 42 };
    return &s; // no problem
}

struct S* fun2()
{
    struct S a = { 10, 42 };
    return &a; // UB
}
 类似资料:
  • 本文向大家介绍C中的++ * p,* p ++和* ++ p之间的区别,包括了C中的++ * p,* p ++和* ++ p之间的区别的使用技巧和注意事项,需要的朋友参考一下 指针式 在C语言中,* p表示存储在指针中的值。++是前缀和后缀表达式中使用的增量运算符。*是取消引用运算符。前缀++和*的优先级相同,并且两者从右到左关联。后缀++的优先级高于前缀++和*,并且从左到右具有关联性。请参见以

  • 本文向大家介绍连续和非连续内存分配之间的区别,包括了连续和非连续内存分配之间的区别的使用技巧和注意事项,需要的朋友参考一下 在这篇文章中,我们将了解连续和非连续内存分配之间的区别- 连续内存分配 在这种分配类型中,连续的内存块被分配给一个文件/进程。 与不连续的内存相比,它执行得更快。 易于通过操作系统进行控制。 开销最小,因为在执行进程时地址转换不多。 连续内存分配中存在内部碎片。 有不同类型的

  • 本文向大家介绍内存和存储之间的区别,包括了内存和存储之间的区别的使用技巧和注意事项,需要的朋友参考一下 记忆 内存允许短期存储数据。存储器通常由寄存器组成。每个寄存器都有一个称为存储位置或存储位置的位置。每个存储位置均由一个地址标识。内存容量由否决定。内存可以存储的位数。内存分为三种主要类型: 高速缓存存储器 主记忆 二级记忆 存储 存储允许长期存储数据。只要程序需要数据,就将数据从存储器复制到内

  • 本文向大家介绍get和post请求在缓存方面的区别?相关面试题,主要包含被问及get和post请求在缓存方面的区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: post/get的请求区别,具体不再赘述。 补充补充一个get和post在缓存方面的区别: get请求类似于查找的过程,用户获取数据,可以不用每次都与数据库连接,所以可以使用缓存。 post不同,post做的一般是修改和删除的工

  • 本文向大家介绍虚拟内存和缓存内存之间的区别,包括了虚拟内存和缓存内存之间的区别的使用技巧和注意事项,需要的朋友参考一下 在计算机环境中,内存是至关重要的部分,因为它是唯一负责系统性能和系统存储容量的部分。众所周知,内存负责任何应用程序的加载和执行,还用于存储其数据,以后可被其使用,因此在加载或安装应用程序之前了解系统的内存配置非常重要。 现在,在本主题中基本上将要讨论的是两种类型的存储器,即虚拟存

  • 本文向大家介绍浅谈java+内存分配及变量存储位置的区别,包括了浅谈java+内存分配及变量存储位置的区别的使用技巧和注意事项,需要的朋友参考一下 Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域: ◆寄存器:我