私が割り当てたメモリをdinamicallyで解放しないと私のプログラムが動作しますが、解放しようとするとクラッシュします。私はDev-C++で自分のコードを実行していますが、エラーメッセージは役に立ちません。問題がプログラムの動作を停止させました。 問題はコードの最後です。私が自由な部分を取る場合、プログラムは正常に動作します。配列にフリー関数(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))、何とかこれらの2つに問題があります。
あなたの問題は 'free'は一般的にあなたのコードのどこか他の場所でオーバーランが発生するためです。私は見てみましょう。 –
'malloc(n * sizeof(double));' - これは割り当てループの最初の繰り返しではゼロ割り当てになります。私は 'malloc((n + 1)* sizeof(double));にそれを変更するとは思わない;特にあなたが* m = 0でその場所を読み込んでいるので違いがある。 m <= n'を内部ループのinit /条件として使用します。 – WhozCraig
@ DavidC.Rankin あなたはそうです!最初のループには何も割り当てません。それはおそらく問題です。出来た!ありがとう、男! –