修改《Beginning C第五版》字符串排序代码触发realloc(): invalid next size错误
问题根因
你触发realloc(): invalid next size错误的核心原因是realloc调用参数错误:realloc第二个参数需要传入扩容后的总字节数,但你和书中原版代码都只传了指针数组的元素个数capacity,没有乘以单个指针的大小sizeof(char*)。
初始capacity为5,第一次calloc调用写法正确,分配了5个char*指针的空间,可正常存储前5个字符串。当存满5个字符串触发扩容时,capacity更新为6,此时realloc(pS, 6)仅分配了6字节的内存空间,而64位系统下单个char*指针就占8字节,写入第6个字符串的指针时直接越界破坏了堆内存的元数据结构,等到输入第7个字符串再次触发扩容时,realloc检测到堆结构损坏就抛出了错误,完全匹配你遇到的现象。
你将strnlen_s替换为strnlen、strcpy_s替换为strcpy的操作没有问题,只要输入的字符串长度不超过BUF_LEN-1,两个函数的行为在这里完全符合预期,不是错误诱因。
修复方法
仅需要修改realloc行的参数即可,将:
if(!(psTemp = realloc(pS, capacity))) return 1;
修改为:
if(!(psTemp = realloc(pS, capacity * sizeof(char*)))) return 1;
内容的提问来源于stack exchange,提问作者amehdi96
相关产品推荐
相关产品推荐

