コンマで区切られた整数値を配列に読み込んで並列構造で処理しようとするプログラムを記述しました。 これにより、ダイナミック配列の最大サイズが固定されていることがわかりました。ダイナミックアレイのサイズは、通常、サイズを2倍にして動的に割り当てられます。それでも、5000を超える値を持つデータセットの場合、それを二重にすることはできません。動的配列に大きなスペースを割り当てる
技術的に、他の投稿が私たちにすべきことを指摘していたので、私はちょっと混乱しました(reallocを使用してください。代わりにスタックを使用しないでください)。
5000以下の値を持つファイルであれば問題ありません。 また、reallocを使っても同じ結果が得られました。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// compile with gcc filename -lpthread -lm -Wall -Wextra -o test
int reader(int ** array, char * name) {
FILE *fp;
int data,row,col,count,inc;
int capacity=10;
char ch;
fp=fopen(name,"r");
row=col=count=0;
while(EOF!=(inc=fscanf(fp,"%d%c", &data, &ch)) && inc == 2){
if(capacity==count)
// this is the alternative with realloc we tried. Still the same issue.
//*array=malloc(sizeof(int)*(capacity*=2));
*array = realloc(*array, sizeof(int)*(capacity*=2));
(*array)[count++] = data;
//printf("%d ", data);
if(ch == '\n'){
break;
} else if(ch != ','){
fprintf(stderr, "format error of different separator(%c) of Row at %d \n", ch, row);
break;
}
}
// close file stream
fclose(fp);
//*array=malloc(sizeof(int)*count);
*array = realloc(*array, sizeof(int)*count);
return count;
}
int main(){
int cores = 8;
pthread_t p[cores];
int *array;
int i = 0;
array=malloc(sizeof(int)*10);
// read the file
int length = reader(&array, "data_2.txt");
// clean up and exit
free(array);
return 0;
}
EDIT:私たちが試したreallocコマンドを含めて、元のテスト値(10で始まる)に値を戻しました。しかし、これは結果に影響を与えませんでした、またはむしろまだ動作しません。とにかくエラーを指摘してくれてありがとう!私はまた、含まれるコードを関連する部分に減らしました。
はがこのように動作するはずですが、私たちが見落とした小さな間違いかもしれません。 ありがとうございます。
私は 'realloc'を見ていません。私はあなたが' malloc'を使って繰り返してメモリを漏らしているのを見ています。 –
1)あなたはどのように知っていますか?私はあなたがすべき 'malloc'の結果を確認することはありません。 2) 'while'ループに大量のメモリリークがあります。 – Olaf
あなたの配列は、最初は10個の要素配列として割り当てられますが、50001個の要素で満たされます。そのため、あなたはあなたのmemeoryを台無しにしています。 reallocを使うか、配列を手作業でコピーして古いものを解放してください。それに加えて、私はいくつかのコーディングスタイルガイドを読むことをお勧めします。あなたのコードは実際にはいくつかの場所で醜いです。さらに、問題の最小限の実例を作成する必要があります。多くのコードはあなたの問題に属しません。 @EugeneSh。 –