Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我在函数末尾出错?_C - Fatal编程技术网

C 为什么我在函数末尾出错?

C 为什么我在函数末尾出错?,c,C,我正在学习我的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

我正在学习我的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);
            }
        }
    }
}

知道我为什么会在上面出错吗

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

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

字符温度[]=

温度大小太小,无法容纳c[j]。使它足够大,以便它能容纳c[j]。例如

字符温度[5]=


其次,内部循环迭代的冒泡排序不正确。使用j这个temp[]的定义用一个字符字节0初始化它。复制c[j]时,将c[j]的所有字节复制到内存中,从temp开始。如果c[j]有超过1个字符,则不属于temp的额外内存将被覆盖,很可能是函数的本地堆栈帧

编译器在调试模式和报告中对此进行检查-请参阅和中的详细信息


如果在堆栈上分配太多,则会导致堆栈溢出

字符温度[]=;太小,无法复制到中。请尝试char temp[5]=;temp的大小为1,足以存储空字符串,而不存储其他内容。由于您没有明确指定它,因此temp的大小取自初始值设定项的大小,即1。因此,temp不够大,无法容纳任何字符串。使用temp[]=”;或temp[5]=”:@JohnBode我建议您不要使用“或”。-@Michael您很幸运您遇到了一个错误。C代码中的错误可以以各种奇怪和奇妙的方式表现出来。memset是无意义的。temp总是在使用之前设置的。最大长度是已知的字符C[][5]字符串的.max_长度?如何?我根据您的评论更正了我的响应。您是对的,memset在这种情况下毫无意义。编译器在调试模式下检查此项调试模式?哪种调试模式?在C中从不依赖编译器完成程序员的工作。/RTC开关-默认情况下在调试模式下启用。调试和发布生成差异如果你写一个向量的直接范围检查或者指定编译器来做这件事-这两个都有帮助。
Run-Time Check Failure #2 - Stack around the variable 'temp' was corrupted.