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

C语言动态数组触发SIGSEGV信号的问题排查

动态数组实现中的段错误(SIGSEGV)原因分析

直接触发原因

调用DSTR_vector_push时的传参错误导致非法内存访问:

DSTR_vector_push(&int_vec, 10);

函数DSTR_vector_push的第二个参数要求是void*类型,但这里直接传入了int字面量10。C语言会将这个整数隐式转换为指针,指向内存地址0x0000000A——这是一个完全不可访问的非法地址。当函数内部执行*(int*)value解引用该指针时,直接触发SIGSEGV段错误信号。

修复方案

需要传递10的内存地址而非字面量:

int val = 10;
DSTR_vector_push(&int_vec, &val);

其他潜在问题

  • malloc(0)的行为风险:C标准中malloc(0)的行为是实现定义的,部分编译器返回NULL,部分返回不可访问的内存块。初始化时直接将data设为NULL即可,无需调用malloc(0),兼容性更好。
  • 缺失realloc失败处理:realloc在内存不足时会返回NULL,当前代码直接用返回值覆盖vector->data会导致原有内存地址丢失,引发内存泄漏。需要先判断realloc的返回值,确认分配成功后再更新指针。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:15:33