簡體   English   中英

在數組上使用自由函數(C)時我的程序崩潰

[英]My program crashes when using free function (C) on array

如果不釋放分配給我的內存,我的程序就會工作,但是當我嘗試釋放它時,它就會崩潰。 我在Dev-C ++上運行我的代碼,但錯誤消息沒有幫助:問題導致程序停止運行。 問題在代碼末尾。 如果我考慮釋放部分,則該程序可以正常運行。 這是一個示例輸入:

5
2.3
1.4 8.2
3.1 2.0 7.7
5.3 6.1 4.4 1.2
5.5 6.1 3.0 2.3 4.9 

編碼:

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

int main(void) {
    int ordem;
    scanf("%d", &ordem);
    double **vetor; //apontador para apontador (jagged array)
    double soma = 0;
    int elementos;
    elementos = (ordem*ordem + ordem) / 2;
    vetor = malloc(ordem * sizeof(double*));   //o primeiro endereço do vetor é seu local de memória, que define quantos pointers ele terá (ordem)
    int n, m;
    for (n = 0; n < ordem; n++) {
        *(vetor + n) = malloc(n * sizeof(double));
    }
    for (n = 0; n < ordem; n++) {
        for (m = 0; m <= n; m++) {
            scanf("%lf", *(vetor + n) + m);
            soma = soma + *(*(vetor + n) + m);
        }
    }
    double media = soma / (double) elementos;
    double aux = 0;
    for (n = 0; n < ordem; n++) {
        for (m = 0; m <= n; m++) {
            aux = aux + pow((media - vetor[n][m]), 2);
        }
    }
    double desvio = sqrt(aux / ((double)elementos));
    for (n = 0; n < ordem; n++) {
        for (m = 0; m <= n; m++) {
            printf("%.12lf ", (vetor[n][m] - media) / desvio);
        }
        printf("\n");
    }
    printf("\n%.12lf %.12lf \n", media, desvio);

    for (n = 0; n < ordem; n++) {
        free(*(vetor + n));
    }
    free(vetor);

    return 0;
}

就是這樣。 我不知道該如何解決。 我不認為dealloc具有相同的效果。 我寧願堅持自由。 我發現的新信息:對於示例輸入,我可以釋放( (vetor + 0)),( (vetor + 1))和(*(vetor + 2)),但不能釋放3和4。這意味着向量在某種程度上具有這兩個問題。

更改此:

for (n = 0; n < ordem; n++) {
    *(vetor + n) = malloc(n * sizeof(double));
}

對此:

for (n = 0; n < ordem; n++) {
    *(vetor + n) = malloc((n + 1) * sizeof(double));
}

原因是在第一次迭代中n為零,因此您正在請求malloc()為您分配零字節。

順便說一句,這是我通常不會犯的錯誤: 2d-dynamic-array-c

輸出:

C02QT2UBFVH6-lm:~ gsamaras$ gcc -Wall main.c 
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
5
2.3
1.4 8.2
3.1 2.0 7.7
5.3 6.1 4.4 1.2
5.5 6.1 3.0 2.3 4.9
-0.892202112506 
-1.307537578672 1.830552610141 
-0.523015031469 -1.030647267895 1.599810684493 
0.492249441383 0.861436522419 0.076913975216 -1.399834348932 
0.584546211642 0.861436522419 -0.569163416599 -0.892202112506 0.307655900864 

4.233333333333 2.166923061753
C02QT2UBFVH6-lm:~ gsamaras$

您已經收到了答案,但是,如果您要確信自己的代碼正在使用實際值並且不會寫到硬件內存的未知部分,則確實需要在其他幾個方面驗證 輸入和分配 始終, 始終 ,驗證用戶輸入和內存分配。 僅需要幾行代碼即可提供幫助,例如:

int ordem;
if (scanf ("%d", &ordem) != 1) {
    fprintf (stderr, "error: invalid input (ordem)\n");
    return 1;
}
double **vetor,
       soma = 0;
int elementos, n, m;

elementos = (ordem * ordem + ordem) / 2; 
if (!(vetor = malloc (ordem * sizeof *vetor))) {
    fprintf (stderr, "error: virtual memory exhausted.\n");
    return 1;
}

for (n = 0; n < ordem; n++)
    if (!(*(vetor + n) = malloc ((n + 1) * sizeof **vetor))) {
        fprintf (stderr, "error: virtual memory exhausted.\n");
        return 1;
    }

for (n = 0; n < ordem; n++) {
    for (m = 0; m <= n; m++) {
        if (scanf ("%lf", *(vetor + n) + m) != 1)  {
            fprintf (stderr, "error: invalid input (vetor + %d)\n", n);
            return 1;
        }
        soma = soma + *(*(vetor + n) + m);
    }
}

祝您編碼順利。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM