C++中字符数组与整型数组直接赋值差异问题咨询
栈内存生命周期陷阱:局部数组指针的未定义行为
问题代码
#include <iostream> #include<string.h> struct ans{ size_t len1; uint8_t *buf; int * arr; size_t len2; }; void func(ans &a){ uint8_t b[]={"Hello"}; std::cout<<b<<std::endl; int arr[]={0,1,2}; a.len1=6; a.len2=3; a.buf=b; a.arr=arr; } int main() { // Write C++ code here ans a; func(a); std::cout<<a.arr[1]<<std::endl; std::cout << a.buf[1]; return 0; }
问题解答
1. 字符数组直接赋值给char*是否可行?
语法上是允许的,但你的代码问题和赋值本身无关——你赋值的是局部栈数组的地址,函数执行完毕后该内存已被释放,指针变成野指针。
函数func中的b是栈上分配的局部数组,当func执行完成返回main时,这块栈空间会被系统回收,此时a.buf指向的是已失效的内存,访问a.buf[1]属于C++标准中的未定义行为,输出乱码是这种行为的典型表现。
2. 为何整型数组直接赋值给int*似乎可行?
这完全是运气问题,本质同样是未定义行为。func中的arr也是局部栈数组,函数返回后其内存同样被释放,a.arr也是野指针。只是你运行时这块内存恰好还没被其他操作覆盖,所以能读出正确值,但只要修改代码、更换编译环境或调整编译选项,结果就可能变成乱码甚至程序崩溃。
替代方案(无需动态分配/拷贝)
如果不想用动态内存分配或数据拷贝,需让指针指向生命周期覆盖整个使用过程的内存,比如:
- 全局数组
- 用
static修饰的局部数组(注意多线程场景下的线程安全问题) - 从外部传入函数的数组
内容的提问来源于stack exchange,提问作者sandeep kumar
相关产品推荐
相关产品推荐

