You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:01:28