使用免费功能释放内存导致程序崩溃

时间:2017-05-25 09:11:37

标签: c memory malloc free

我可以对我的程序使用一些帮助, 我写了一个计算句子中字谜数量的程序,我正在使用malloc()函数,你可以在我的代码**ArrPtr=malloc中看到。

我用它来计算字谜,在完成之后我想继续我的第二部分程序,我希望用free(arrPtr);释放内存 并且程序崩溃(当我没有使用免费选项时它没有崩溃)。

这是我的代码,

void main()
{
    char str[1001] = { 0 };
    char temp[1001] = { 0 }, temp2;
    char strB[1001] = { 0 };
    int printf_i, counter, i, q, flag, j = 1, r = 0, m = 1, length = 0, root = 0, m1 = 0;
    int max_analogy = 0, counter2 = 0, O, sum, sum2;
    char **arrPtr;
    int k = 0;
    int **matrix;

    printf("Please enter the sentence, and then press Enter:\n");
    gets(str);

    //bubble sort
    strcpy_s(strB, 1001, str);
    for (i = 0; i < strlen(strB); i = q + 2)
    {
        do
        {
            flag = 0;
            for (q = i; strB[q + 1] != 32 && strB[q + 1] != 0; q++)
            {
                if (strB[q] > strB[q + 1])
                {
                    // Swap
                    temp2 = strB[q];
                    strB[q] = strB[q + 1];
                    strB[q + 1] = temp2;
                    flag = 1;
                }
            }
        } while (flag != 0);
    }
    counter = 1;
    length = strlen(strB);

    for (i = 0; strB[i] != 0; i++)
    {
        if (strB[i] == 32)
        {
            strB[i] = 0;
            counter++;
        }
    }

    arrPtr = (char*)malloc(sizeof(char)*counter);
    arrPtr[0] = strB;
    q = 1;
    for (i = 0; i < length - 1; i++)
    {
        if (strB[i] == 0)
        {
            arrPtr[q] = &strB[i + 1];
            q++;
        }
    }

    counter2 = 0;
    for (i = 0; i < counter; i++)
    {
        for (q = i + 1; q < counter; q++)
        {
            if (arrPtr[q] == 0 || arrPtr[i] == 0)
                continue;
            if (!strcmp(arrPtr[q], arrPtr[i]))
            {
                counter2++;
                arrPtr[q] = 0;
            }
        }
        if (max_analogy < counter2)
            max_analogy = counter2;
        counter2 = 0;
    }
    printf("The maximum number of anagram words in this sentence is %d.\n", max_analogy);

    free(arrPtr);
}

1 个答案:

答案 0 :(得分:1)

arrPtr = (char*)malloc(sizeof(char)*counter); 

错误的原因很多:

  1. arrPtr(char **)
  2. 使用C编译器进行转换是无用且危险的。
  3. 您必须分配sizeof(char *)
  4. 原因3是您遇到问题的真正原因:您在编写counter(最有可能是counter*sizeof(char *))时分配counter*8字节,因此您正在写出超出已分配内存的范围破坏malloc内存池。

    您可以使用

    修复它
    arrPtr = malloc(sizeof(char *)*counter);