@blizzils

Выдает то signal: illegal instruction core dumped то stack smashing detected terminated. Как исправить?

spoiler
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *summer(char f[], char ff[]);

int main(void) {
  char firstFraction[2];
  char secondFraction[2];
  char *summa;
  printf("Первая дробь: ");
  scanf("%s", firstFraction);
  printf("Вторая дробь: ");
  scanf("%s", secondFraction);
  printf("%s", secondFraction);
  summa = summer(firstFraction, secondFraction);
  printf("%s", firstFraction);
  free(summa);
  return 0;
}

char *summer(char f[], char ff[]) {
  char *summ;
  int a = (int)f[0];
  int b = (int)f[2];
  int c = (int)ff[0];
  int d = (int)ff[2];
  char upper = (char)((a * d) + (b * c));
  char downer = (char)(b * d);
  summ[0] = upper;
  summ[2] = downer;
  return summ;
}



Проблема пока что в первой половине (хотя сомневаюсь во всём).
Если я проверочно вывожу содержимое первого массива (firstFraction) ДО ввода данных во второй массив secondFraction, то все отлично. Но стоит мне перенести этот принт ПОСЛЕ ввода данных в secondFraction, то вылезает ошибка signal: illegal instruction core dumped. Закомментила всё, кроме создания массива и его заполнения. Появилась ошибка stack smashing detected terminated. Поменяла 2 в квадратных скобках на 3. Заработало. Как только всё расскоментила, то ошибка вернулась signal: illegal instruction core dumped. Помогите исправить код.
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Строки ваши подлиннее сделайте. Вы там по 2 символа для каждой выделяете. Но надо еще место для закрывающего 0 оставить. Поэтому, если пользователь вводит более 1 символа, происходит переполнение стека.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
CityCat4
@CityCat4
Жил-был у бабушки серенький троллик...
Хорошо, что компиляторы не имеют души :) и не могут сказать "О великий компьютерый бог, что тут меня заставляют делать!" :)

Этот код - по-моему одна большая сплошная нелепость. Давайте начнем с постановки задачи, да? Как было сформировано условие?

Ну и сразу что бросается в глаза:
char firstFraction[2];
  char secondFraction[2];

Во-первых.
Чего так мало места? В такой прости-Господи массив поместится ровно один символ (потому что второй займет '\0')
Во-вторых.
Почему вообще char? Понятие указателя не одолели, что ли? Вы там какую то арифметику делать будете - какого фига не вводить сразу int? Если стоит условие ввода в char - я не вижу atoi()
scanf("%s", firstFraction);
Продолжение предыдущего вопроса - почему ввод строковый, хотя предполагается арифметика? Зачем лишний раз конвертить из строки в число? Или Вы полагаете, что С, как многие модно-стильно-молодежные языки - сам определит тип переменной в зависимости от операции? Так вот, черта с два. С - язык старой школы, он требователен и к программе и к программисту. Никакой автотипизации, никакой сборки мусора - все на совести программиста.

Пишите условие задачи, а там посмотрим.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы