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
相关产品推荐
相关产品推荐

