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

C语言初始化结构体指针成员触发段错误 如何正确给const int*成员赋值

段错误原因

触发崩溃的核心问题是对指针成员的内存逻辑理解错误:

  1. 结构体中const int *ptr是一个指针变量,memset将结构体内存全置0后,ptr的值为NULL,没有指向任何合法可读写的内存地址。
  2. 你写的memcpy(p->ptr,&num,sizeof(int))语义是:将num的内容拷贝到p->ptr指向的内存地址中。向NULL地址写入数据必然触发段错误。
正确实现方式

根据你的业务需求选对应写法即可:

  • 需求1:让ptr直接指向外部的num变量
    不需要用memcpy,直接将num的地址赋值给ptr指针本身即可:

    int num = 10;
    p->a = 1;
    p->ptr = #
    // 后续通过*p->ptr即可读取到值10
    

    注意:这种写法要求num的生命周期必须覆盖p->ptr的使用周期,若num随栈帧销毁后仍访问p->ptr会触发野指针异常。

  • 需求2:让结构体独立持有num的值副本,不依赖外部变量生命周期
    先为ptr申请合法的堆内存空间,再执行内存拷贝:

    int num = 10;
    p->a = 1;
    // 先给ptr分配对应大小的堆内存
    p->ptr = (const int*)malloc(sizeof(int));
    // 内存申请成功后再拷贝num的值到ptr指向的堆空间
    memcpy((void*)p->ptr, &num, sizeof(int));
    

    注意:最后释放内存时要先释放p->ptr指向的堆块,再释放p本身,避免内存泄漏:

    free((void*)p->ptr);
    free(p);
    
易混淆点说明
  • 区分两个操作:p->ptr = &num是修改指针变量本身存储的地址值;memcpy(p->ptr, &num, sizeof(int))是修改指针指向的内存位置存储的内容,后者必须提前保证指针已经指向合法可访问的内存。
  • const int *ptr的const修饰的是指针指向的内容,而非指针本身:你可以自由修改ptr存储的地址值,让它指向别的位置,但不能通过*p->ptr = 新值的方式直接修改它指向的内存里的内容。

内容的提问来源于stack exchange,提问作者MURICA213

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:06:24