从头部逐元素释放动态分配整数数组时出现无效指针错误的原因排查求助
问题根源与修复方案
嘿,我一眼就发现了导致无效指针错误的核心问题——你完全搞错了动态数组的内存释放方式,同时还弄丢了关键的原始内存地址,具体来说:
1. 错误的单个元素free操作
job_factorization里用malloc和realloc分配的是一整块连续的内存区域,只有这个区域的原始首地址(也就是函数返回的初始factors指针)才能传给free来释放整块内存。但你在循环里做的是每次把当前factors指针存到tmp,移动指针后free(tmp)——这里的tmp指向的是数组里单个元素的位置,根本不是malloc返回的合法首地址,对这种指针执行free必然触发无效指针错误。
2. 丢失原始内存首地址
循环里你不断执行factors++,把原本指向数组开头的指针一步步移到了后面的元素,这样就彻底丢失了malloc给你的原始地址——哪怕你之后想改过来整块释放,也找不到正确的入口了。
修复后的代码
只需要调整输出和释放逻辑,要么保存原始指针,要么直接用数组下标访问,最后一次性释放整块内存:
方案一:保存原始指针
int* factors = job_factorization(number, size); // 先把原始首地址存下来,避免移动指针后丢失 int* original_ptr = factors; printf("Thread %d: job terminated. Result: ", params->thread_id); for (int i = 0; i < *size; i++){ printf("%d ", *factors); factors++; } // 用原始地址释放整块内存 free(original_ptr);
方案二:用数组下标访问(更直观)
int* factors = job_factorization(number, size); printf("Thread %d: job terminated. Result: ", params->thread_id); for (int i = 0; i < *size; i++){ printf("%d ", factors[i]); } // 直接释放原始指针即可 free(factors);
这样调整后,既能正确输出所有因数,又能合法释放内存,不会再触发无效指针错误啦。
内容的提问来源于stack exchange,提问作者Shark44
相关产品推荐
相关产品推荐

