C语言实现单词右移旋转表代码GDB正常Code::Blocks运行报错
问题根因排查
1. 指针数组内存分配错误(直接触发段错误)
你在returnTable函数中分配rotationTable时的参数完全错误:
char** rotationTable = malloc(length*sizeof(char));
rotationTable是char**类型,对应存储length个char*指针,每个指针的大小在32位系统是4字节、64位系统是8字节,远大于1字节的sizeof(char)。你分配的内存空间不足,后续给rotationTable[i]赋值时发生数组越界,直接触发内存访问冲突,也就是你遇到的-1073741819错误(Windows下的段错误状态码)。
调试模式正常是因为调试模式下内存分配会加额外的填充字节,刚好掩盖了越界问题,属于典型的未定义行为表现。
2. 预分配的内存完全被丢弃,存在内存泄漏
你在returnTable中用calloc分配了values整块内存,并把每个rotationTable[i]指向了这块内存的对应位置,但在orderedConjugacyClass函数中直接用strdup的返回值覆盖了rotationTable[i]的原有指针:
table[0] = strdup(word); ... table[j] = strdup(buffer);
这导致你预先分配的values内存块的首地址完全丢失,永远无法释放,产生内存泄漏,且这部分预分配逻辑完全没有起到作用。
修复方案
方案1:保留预分配逻辑,删除strdup调用
修改returnTable的分配大小,且填充函数直接往预分配的内存里拷贝字符串,不需要额外申请:
- 修正
returnTable的malloc参数:
char** returnTable(int length){ // 注意这里改成sizeof(char*) char** rotationTable = malloc(length * sizeof(char*)); char* values = calloc((length+1)*length, sizeof(char)); for(int i=0; i<length; i++){ rotationTable[i] = values + i*(length+1); } return rotationTable; }
- 修改
orderedConjugacyClass函数,去掉strdup,直接拷贝到预分配内存:
void orderedConjugacyClass(char** table, char* word, int length){ // 直接拷贝到预分配的空间,不要strdup strcpy(table[0], word); int j = 1; char buffer[length+1]; buffer[0] = '\0'; while(j < length){ char* p = &table[j-1][length-1]; char* q = &table[j-1][0]; strncat(buffer, p, 1); strncat(buffer, q, length-1); buffer[length] = '\0'; // 直接拷贝,不要strdup strcpy(table[j], buffer); buffer[0]='\0'; j++; } }
- 对应的释放逻辑需要修改,因为
rotationTable[i]都指向同一块values内存,不需要逐个释放,直接先释放values再释放rotationTable即可:
// main函数释放部分修改为 free(rotationTable[0]); // 因为rotationTable[0]就是values的首地址 free(rotationTable);
方案2:删除无用的预分配逻辑,完全用strdup申请内存
如果不需要整块预分配,可以直接简化returnTable,只分配指针数组即可:
char** returnTable(int length){ // 只分配指针数组的空间 return malloc(length * sizeof(char*)); }
原有填充逻辑和释放逻辑保持不变即可,这种方式更简单。
内容的提问来源于stack exchange,提问作者blaz
相关产品推荐
相关产品推荐

