@arkadiy_ksvu
учусь на физтехе

Почему возникает malloc(): corrupted top size?

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

const long long int M = 1e9 + 21;
const long long int P = 2027;

void degreesP(long long int p, long long int m, int n, long long int* degrees)
{
    degrees[0] = 1;

    for (int i = 1; i < n; i++)
    {

        degrees[i] = ( degrees[i - 1] * (long long) p) % m;

    }

}

long long int polynomHash(char* s1, int len, long long int* degrees, long long int m)
{

    long long int hash = 0;

    for (int i = 0; i < len; i++)
    {

        hash = (hash * degrees[1]) % m;
        hash += (((long long) s1[i]));
        hash %= m;

    }

    return hash;

}


void rabinKarp(char* s1, char* s2, int len_s1, int len_s2, long long int* degrees, long long int m)
{

    long long int hash1 = polynomHash(s1, len_s2, degrees, m);
    long long int hash2 = polynomHash(s2, len_s2, degrees, m);

    int raz = len_s1 - len_s2;

    for (int i = len_s2; i <= len_s1; i++)
    {

        if (hash1 == hash2)
        {

            if (!strncmp(s1 + i - len_s2, s2, len_s2))
            {

                //printf("1");
                //putchar('E');
                printf("%d\n", i - len_s2);

            }

        }

        hash1 = (((hash1 * degrees[1] % m - degrees[len_s2] * s1[i - len_s2]
                                                      + s1[i])% m) + m) % m;


    }

    return;
}



int main()
{
    //printf("sdc");

    char* s1 = (char*) calloc(5 * 10000 + 2, sizeof(char));
    char* s2 = (char*) calloc(5 * 10000 + 2, sizeof(char));
    //printf("dsc1\n");
    scanf("%s", s1);
    scanf("%s", s2);
    //printf("dsc2\n");
    int len_s1 = strlen(s1);
    int len_s2 = strlen(s2);

    if (len_s1 < len_s2)
    {

        return 0;

    }

    long long int* degrees = (long long int*) calloc(len_s1, sizeof(int));

    degreesP(P, M, len_s1, degrees);
    //printf("sdd4\n");
    rabinKarp(s1, s2, len_s1, len_s2, degrees, M);
    //printf("opdop\n");
    free(degrees);
    free(s1);
    free(s2);
    //printf("sdcvdsf\n");
}

/*
abracadabra
ra
*/


Почему когда строка в main "printf("sdc")" закоментирована, то возникает "malloc(): corrupted top size", а когда незакомментирована то этой ошибки нет?
  • Вопрос задан
  • 1786 просмотров
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Вот тут: (long long int*) calloc(len_s1, sizeof(int)); вы выделяете массив int на len_s1 элементов, а потом работаете с ним, как с массивом long long той же длины. Но long long занимает больше байт! Поэтому вы выделяете меньше памяти, чем используете, а это UB.

В этом случае программа может даже отработать, если повезет. И любое изиенение в ней может непредсказуемо изменить, как ошибка проявится: упадет ли программа, повиснет или просто не так отработает.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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