代码之家  ›  专栏  ›  技术社区  ›  Michael

为什么函数结束时出错?

c
  •  -3
  • Michael  · 技术社区  · 6 年前

    我在写我的C教程。

    我有这个功能:

    void sortString(char c[][5], int size) {
        char temp[] = "";
    
        for (int i = 0; i < size - 1; i++)
        {
            for (int j = 0; j < size - 1; j++)
            {
                if (strcmp(c[j],c[j+1]) > 0) //arr + j
                {
                    strcpy(temp, c[j]);// only strcpy, assignment not works
                    strcpy(c[j], c[j + 1]);
                    strcpy(c[j + 1], temp);
                }
            }
        }
    }
    

    在外部循环结束后,当函数结束时,我得到这个错误:

    Run-Time Check Failure #2 - Stack around the variable 'temp' was corrupted. 
    

    知道我为什么会犯错误吗?

    3 回复  |  直到 6 年前
        1
  •  0
  •   Spock77    6 年前

    temp[]的这个定义用一个字符(字节)0初始化它。复制c[j]时,将c[j]的所有字节复制到内存中,从temp开始。如果c[j]有超过1个字符,则不属于temp的额外内存将被覆盖,并且很可能是函数的本地堆栈帧。

    编译器在调试模式和报告中对此进行检查-请参阅 Run-Time Error Checks Stack Allocation .

    如果在堆栈上分配太多,就会出现堆栈溢出!

        2
  •  1
  •   Achal    6 年前

    从你提到的代码中很少观察到。 首先,这里

    char temp[] = "";

    temp 尺寸太小,放不下 c[j] . 把它弄大一点,这样它就可以容纳 c [ j ] . 例如

    char temp[5] = "";

    第二,内部气泡排序 for 循环迭代不正确。而不是 j < size - 1 使用 j < size - i-1 .

        3
  •  0
  •   Mohmmed    6 年前

    没有足够的缓冲区存储作为临时变量。您需要知道给定字符串的最大长度,并在堆栈上分配足够的内存。如果您不知道这一点,那么另一个选项是堆上的动态分配。