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

使用strdup处理void指针时触发Segmentation fault问题求助

问题原因与修复方案

段错误的直接原因

strdup(item) 是完全错误的用法。strdup 的功能是复制以'\0'结尾的C字符串——它会先读取传入指针指向的内存,直到遇到终止符'\0',再分配新内存把内容复制进去。但你传入的item是(void*)0xdeadbeef,这是一个无效的内存地址(根本不是合法的字符串起始地址),strdup尝试读取这个地址时直接触发段错误。

关于void指针的误区

void指针只是个通用容器,用来存任意类型的内存地址,但它不带任何类型信息。你把一个非字符串的地址(甚至是无效地址)传给strdup,而strdup默认认为传入的是char*类型的字符串指针,自然会出错。

修复方案分两种情况

情况1:SpringMap要存储任意类型的指针(不是字符串)

你要存的是item这个指针本身的值,不是它指向的内容,直接赋值就行,根本不需要strdup:

tmp->next->item = item;

注意:这种情况下,要保证item指向的内存在SpringMap的生命周期内有效;如果需要在释放SpringMap时回收内存,得根据存储的具体类型做对应处理。

情况2:SpringMap要存储字符串类型的item

那必须确保传入的item是合法的char*字符串指针,比如把main里的代码改成:

void* ptr[TESTS] = {(void*)"hello"};

此时strdup((char*)item)(或者直接strdup(item),因为void指针可以隐式转char*)是有效的,因为item确实指向合法的C字符串。

代码里的小问题

  • return 0后面缺了分号;
  • ESTS是拼写错误,应该改成TESTS。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:56:08