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()不是这样呢?它是否在其他地方获得内存而不是堆栈?
在您的例子中,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在内存分配时会涉及到以下区域: ◆寄存器:我