代码之家  ›  专栏  ›  技术社区  ›  Levent Ozbek

尝试使用动态数组时出现堆栈粉碎错误

  •  1
  • Levent Ozbek  · 技术社区  · 4 年前

    我试图从用户输入创建2个动态数组,但是编译器抛出了一个堆栈粉碎数组。这是我的代码:

    #include <stdio.h>
    
    #define _CRT_SECURE_NO_WARNINGS
    #define NUMS 3
    
    // Put your code below:
    
    int main() {
        int high, low;
        int high_temp[3];
        int low_temp[3];
        int total_temp = 0;
        double median = 0;
        printf("---=== IPC Temperature Analyzer ===---\n");
    
        for (int i = 1; i <= NUMS; i++) {
            printf("Enter the high value for day %d: ", i);
            scanf("%d/n", &high);
    
            printf("Enter the low value for day %d: ", i);
            scanf("%d/n", &low);
    
            if(!((high > low && high < 41) && (low < high && low > -41))) {
                printf("Incorrect values, temperatures must be in the range -40 to 40, high must be greater than low");
                i = i - 1;
            }else{
                high_temp[i] = i;
                low_temp[i] = i;
            }
        }
    
        for (int i = 0; i < sizeof(high_temp); i++){
            //total_temp = total_temp + high_temp[i] + low_temp[i];
    
            printf("The high value: %d", high_temp[i]);
            printf("The low value: %d", low_temp[i]);
            printf("-----");
        }
    }
    

    ---=== IPC Temperature Analyzer ===---
    Enter the high value for day 1: 8
    Enter the low value for day 1: -2
    Enter the high value for day 2: 41
    Enter the low value for day 2: -4
    Incorrect values, temperatures must be in the range -40 to 40, high must be greater than low
    Enter the high value for day 2: 9
    Enter the low value for day 2: -4
    Enter the high value for day 3: 5
    Enter the low value for day 3: 11
    Incorrect values, temperatures must be in the range -40 to 40, high must be greater than low
    Enter the high value for day 3: 11
    Enter the low value for day 3: 5
    *** stack smashing detected ***: terminated
    
    2 回复  |  直到 4 年前
        1
  •  1
  •   Adrian Mole Khaled Ali    4 年前

    代码中有两个主要问题,每个问题一个 for 循环。

    首先,你要记住 C ,数组索引从 n - 1 (其中 n 是数组的大小)。所以,代码:

    for (int i = 1; i <= NUMS; i++) {
        //...
    

    应替换为:

    for (int i = 0; i < NUMS; i++) { // Note that NUMS = 3 and high_temp[3] is out-of-bounds
        //...
    

    第二个for循环有不同的错误。在这里,您正确地从0运行到 价值,但你计算错了 n个 . 所以,代替 sizeof(high_temp) 全部的

    for (size_t i = 0; i < sizeof(high_temp)/sizeof(high_temp[0]); i++){
        //...
    

    (我已将类型从 int size_t sizeof 运算符返回;它通常是 unsigned int unsigned long ,或类似的内容。)

    编辑:在第一个循环中,根据我建议的修改,只需添加 1 i 那是印刷品。所以,就像这样:

        printf("Enter the high value for day %d: ", i + 1);
    

    编辑2: 还有一个关于在第一个循环中分配的值的问题。你这样做:

            }else{
                high_temp[i] = i;
                low_temp[i] = i;
            }
    

    high low 变量前面几行。所以,用这个代替:

            } else {
                high_temp[i] = high;
                low_temp[i] = low;
            }
    
        2
  •  0
  •   Reticulated Spline    4 年前

    1. 你的第一个 for 循环错误。索引应该从0开始,在0之前结束 NUMS 这样地:

    for (int i = 0; i < NUMS; i++)

    这样循环将从0变为2,因为数组索引从0开始,而 high_temp low_temp 数组只能存储3个值。你写这封信的方式 high_temp[3] low_temp[3] 这是无效的。

    1. 第二个循环的上限是错误的。 sizeof(high_temp) 不执行您认为的操作;它返回12而不是3,因此在第二个循环中,您试图访问数组边界之外的元素。一般来说你会用 sizeof(high_temp) / sizeof(high_temp[0]) 但在这种情况下你已经 纽姆斯