【问题标题】:Why is this matrix or array, is just storing garbage?为什么这个矩阵或数组,只是存储垃圾?
【发布时间】:2020-11-16 06:51:22
【问题描述】:
#include    <stdio.h>
int main(void){
    int row, col, mat[row][col], i, j, high = 0, sec_high = 0;
    scanf("%d %d", &row, &col);
    for(i = 0; i < row; i++)
        for(j = 0; j < col; j++){
        printf("\nEnter %d row %d col.\n", i, j);
    scanf("%d", &mat[row][col]);
    printf("%d \n", mat[row][col]);
        }
    for(i = 0; i < row; i++){
        for(j = 0; j < col; j++){
            if (high < mat[i][j]){
                sec_high = high;
                high = mat[i][j];                               
            }
            else if(sec_high < mat[i][j]){
                    sec_high = mat[i][j];
        }
        printf("i%d j%d h%d s%d mat%d\n", i, j, high, sec_high, mat[i][j]);
        }
    }
    printf("The  second highest number is: %d.", sec_high); 
    
}

我在这里要做的只是从矩阵中取出第二高的数字。一切都很好,直到第三个printf 来我得到随机数巨大的数字。这是完全出乎意料的,因为我在输入时已经打印了一次这些数字并且一切都很好。那么这里的逻辑错误是什么?

【问题讨论】:

  • 您在初始化或读取任何内容之前使用rowcolint row, col, mat[row][col]
  • 阅读编译器(例如GCC...)和调试器(例如GDB...)的文档。另请阅读Modern C。阅读您正在使用的每个函数的documentation(例如scanfprintf 等...)。编译所有警告和调试信息:gcc -Wall -Wextra -g。使用gdb 了解程序的行为
  • This answer 与您的问题相关
  • C 程序从上到下执行。不是一次所有的行。
  • 赋值给一个变量和读入一个变量有什么区别?

标签: arrays c matrix


【解决方案1】:
int row, col, mat[row][col], i, j, high = 0, sec_high = 0;

错误,因为 rowcol 未初始化。它们可以包含任意值。如果row 包含 0x1fff0123 而col 包含 0x34567890 会发生什么?

scanf("%d %d", &row, &col);

也是错误的,因为scanf 可能会失败,而您无需对其进行测试。

最后,在call stack 上分配大矩阵为automatic variables 是很糟糕的。由于调用堆栈非常有限(例如,1 MB,这意味着大约 250 000 int-s,这并不多,因为 sizeof(int) 通常是四个字节)

我建议使用C dynamic memory allocation 在堆中分配矩阵,如this answer 所示。请务必测试malloc or of calloc 的成功,并且不要忘记稍后致电free。考虑使用valgrind 猎杀memory leaks

如果您使用最近的 GCC 编译器 with 启用所有警告,例如作为gcc -Wall -Wextra -g,你会得到有用的警告。然后您可以使用GDB 调试器。一旦您的代码正确并且您想要对其进行基准测试,请通过添加 -O2 编译器标志来启用优化。

请务必阅读有关 C 的更多信息(例如 Modern C 书籍和 this 参考)以及 C 编译器和调试器的文档。稍后您可能会对 C11 标准 n1570 和 C 代码的静态分析器(例如 Frama-C)感兴趣(或 this 草稿报告)。

现有开源 C 代码中汲取灵感

例如在github。或GNU software(例如bashmakeemacslibcbinutilsbisongdb等)或Python或@9876中的解释器或运行时组件@ 或 SBCL,或简单的 C 编译器,例如 nwcctinycc(这两个主要用 C 编码)或库,例如 libonionGTK 等等。

考虑在您的代码中使用Clang static analyzer

【讨论】:

  • 在多维数组中获取输入的最佳方式是什么,您能举个例子吗?
  • 为什么会有一个最好的方法?关于示例,请查看githubgitlab
猜你喜欢
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 2019-10-04
相关资源
最近更新 更多