C语言初始化结构体指针成员触发段错误 如何正确给const int*成员赋值
段错误原因
触发崩溃的核心问题是对指针成员的内存逻辑理解错误:
- 结构体中
const int *ptr是一个指针变量,memset将结构体内存全置0后,ptr的值为NULL,没有指向任何合法可读写的内存地址。 - 你写的
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
相关产品推荐
相关产品推荐

