Ошибка разбивки стека при работе с динамическими c массивами - PullRequest
2 голосов
/ 14 марта 2020

Я пытаюсь создать 2 динамических c массива из пользовательского ввода, но компилятор выбрасывает массив разрушения стека. Это мой код:

#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 ]

2 голосов
/ 14 марта 2020

В вашем коде есть две основные проблемы, по одной в каждом for l oop.

Во-первых, вы должны помнить, что в C индексы массивов запускаются с от 0 до 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
    //...

Второй для l oop имеет другую ошибку. Здесь вы правильно работаете с нуля до значения n - 1, но вы неправильно рассчитываете 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 или что-то подобное.)

РЕДАКТИРОВАТЬ: В первом l oop, с предложенными мною модификациями, вы можете «восстановить» правильное число в печатных вопросах, просто добавив 1 до значения i, которое печатается. Итак, вот так:

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

EDIT2: Существует также проблема, связанная со значениями, которые вы назначаете в первом l oop. Вы делаете это:

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

, но значения, которые вы действительно хотите присвоить, были прочитаны в переменные high и low несколькими строками ранее. Итак, используйте это вместо:

        } else {
            high_temp[i] = high;
            low_temp[i] = low;
        }
1 голос
/ 14 марта 2020

Есть несколько проблем с кодом.

  1. Ваш первый for l oop неправильный. Индекс должен начинаться с 0 и заканчиваться до NUMS следующим образом:

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

Таким образом, l oop будет go от 0 до 2, поскольку индексы массива начинаются с 0, а ваши массивы high_temp и low_temp могут хранить только 3 значения. То, как вы это написали, попытается записать в high_temp[3] и low_temp[3], которые недопустимы.

Верхняя граница вашего второго l oop неверна. sizeof(high_temp) не делает то, что вы думаете, он делает; он возвращает 12, а не 3, поэтому в вашем втором l oop вы пытаетесь получить доступ к элементам за пределами массива. Как правило, вы используете sizeof(high_temp) / sizeof(high_temp[0]), но в этом случае у вас уже есть NUMS, так что используйте его.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...