Переменные перемешиваются

Я только недавно начал изучать C и написал код, но после какого-то момента переменные просто перемешиваются. Почему так происходит?

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <string.h>

void save_file(char name[], int a, int b)
{
    int c = a + b;
    
    FILE *file;
    char filename[150];
    sprintf(filename, "C:\\Users\\user\\Desktop\\result.txt");

    file = fopen(filename, "w+");
    fprintf(file, "Your name is %s;\n%d + %d = %d;", name, a, b, c);
}

int main()
{
    srand(time(0));

    char name[] = "";
    char save[] = "";
    int a = rand() % 251;
    int b = rand() % 251;

    printf("Enter your name:\n> ");
    scanf("%s", name);
    printf("Hello, %s!\n", name);
    printf("Save file? (y/n)\n> ");
    scanf("%s", save);

    if (strcmp(save, "y") == 0)
    {
        save_file(name, a, b);
    }

    return 0;
}

Ответы (1 шт):

Автор решения: AlexGlebe

Для всех переменных выделяется фактическое место хранение и фиксированный размер выделенной памяти. Вы выделили строкам всего по одному байту. И пытаетесь что-то поверх записать.

char name[] = "";
char save[] = "";
scanf("%s", name);

Просто-так увеличится размер не может и вы записываете, портя память других переменных.

Для массивов нужно выделить память побольше и при считывания с консоли нужно указывать лимит байт, чтобы и функция scanf никакую память сама не испортила.

char name[256] = "";
char save[256] = "";
scanf("%255s", name);

II. В функции save_file вы не закрыли файловый буфер и файл не запишется. Нужно вызывать fclose.

fclose(file);
→ Ссылка