使用memcopy()复制结构体时出现段错误的问题排查求助
嘿,我来帮你排查这个memcpy()触发段错误的问题——首先先纠正个小笔误,应该是memcpy()不是memcopy()哈。结合你说的「除bow.bag外其他都已正确初始化」,大概率问题就出在bow.bag本身或者memcpy()的参数细节上,我列几个最常见的原因和解决思路:
bow.bag根本没分配可写内存
你说bow.bag未初始化,那它大概率是个野指针(指向随机内存)或者NULL指针。memcpy()需要目标地址指向一块已经分配好、足够容纳要拷贝数据的可写内存。如果bow.bag是word_count_struct*类型,你得先给它分配内存:bow.bag = malloc(sizeof(word_count_struct)); if (bow.bag == NULL) { // 别忘了处理内存分配失败的情况 perror("malloc failed"); return EXIT_FAILURE; }没有这一步就直接用
memcpy()往bow.bag里写,肯定会踩非法内存触发段错。memcpy()的参数顺序搞反了memcpy()的标准语法是memcpy(目标地址, 源地址, 拷贝字节数),很多人会不小心把源和目标写反。比如如果你写成了memcpy(&WCS, bow.bag, sizeof(...)),而bow.bag是野指针,那程序就会尝试读取bow.bag指向的非法内存,直接触发段错。正确的调用应该是:memcpy(bow.bag, &WCS, sizeof(word_count_struct));(这里假设
WCS是word_count_struct类型的变量,如果WCS本身是指针,那源地址就是WCS而不是&WCS)拷贝的字节数写错了
如果你传的不是sizeof(word_count_struct),而是sizeof(word_count_struct*)(结构体指针的大小),或者其他错误的数值,要么会拷贝不完整,要么如果数值过大,会写到bow.bag分配的内存之外的非法区域,同样可能触发段错。一定要确保第三个参数是你要拷贝的结构体的实际大小。bow.bag指向了只读/已释放的内存
比如如果之前bow.bag指向了字符串常量区(比如bow.bag = (word_count_struct*)"some string"),或者指向的内存已经被free()过了,这时候往里面写数据也会触发段错。这种情况要检查bow.bag的赋值历史,确保它指向的是合法的可写内存。
另外,你可以用调试工具快速定位问题:比如用gdb运行你的程序,触发段错后输入bt看调用栈,再用print bow.bag和print &WCS看看这两个地址是否合法,一眼就能看出是不是指针的问题。
内容的提问来源于stack exchange,提问作者Mitch

