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

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的分配大小,且填充函数直接往预分配的内存里拷贝字符串,不需要额外申请:

  1. 修正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;
}
  1. 修改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++;
    }
}
  1. 对应的释放逻辑需要修改,因为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:54:02