以下の関数を実行すると呼び出しに失敗します。
gdbでエラーが出た場所を調べるとsparse_x* sparse_info = (sparse_x ) malloc(1sizeof(sparse_x));で落ちているようです。
他の方の質問を見ても、malloc確保後のことしか書かれていません。
なぜ確保時にこのようなことになるのか教えていただきたいです。
よろしくお願いいたします。
エラーの内容:
malloc(): corrupted top size
Aborted (core dumped)
c
1#include "./Include/sparselib.h" 2#include <stdio.h> 3#include <stdlib.h> 4 5typedef struct { 6 int nnz; // nonzero 7 int* row_p; //row pointer 8 int* col_index; //column index 9 Ull* val; 10} sparse_x; 11 12 13 14sparse_x* sparse_format(int nnz, Ull* val, int* col_index, int* row_index,int row_size,int col_size){ 15 16 if(!val || !col_index || !row_index ) { 17 printf("sparse_format error! \n"); 18 exit(0); 19 } 20 21 sparse_x* sparse_info = (sparse_x *) malloc(1*sizeof(sparse_x)); 22 sparse_info->nnz = nnz; 23 24 int* col_index_sparse = (int*) malloc(nnz*sizeof(int)); 25 int* row_index_sparse_p = (int*) malloc(row_size*sizeof(int)); 26 Ull* val_sparse = (Ull*) malloc(nnz*sizeof(Ull)); 27 28 int col_index_tmp_past = 0,row_index_sum = 0,row_index_tmp = 1,col_index_tmp; 29 row_index_sparse_p[0] = 0; // 0からスタート 30 for (int i=0; i<nnz; i++ ){ 31 col_index_tmp = col_index[i]; 32 col_index_sparse[i] = col_index_tmp; 33 val_sparse[i] = val[col_index_tmp*row_size+row_index[i]]; 34 row_index_sum += 1; 35 if(col_index_tmp!=col_index_tmp_past){ 36 // rowが次に進んだら、次に進んだrowまでの個数を代入 37 row_index_sparse_p[row_index_tmp++] = row_index_sum; 38 } 39 col_index_tmp_past = col_index_tmp; 40 } 41 42 sparse_info->col_index = col_index_sparse; 43 sparse_info->row_p = row_index_sparse_p; 44 sparse_info->val = val_sparse; 45 46 47 return sparse_info; 48 49} 50
失礼。撤回します。
> 他の方の質問を見ても
こういうときの定石は「エラーメッセージそのままで検索する」ことかと思います。
'malloc(): corrupted top size'で検索した結果を見てもヒントになりませんか?
回答いただきありがとうございます
malloc(): corrupted top sizeで調べても、確保したメモリがアクセス時に漏れている場合ばかりで、確保時にエラーになることが書かれていないです。
他の方の指摘にもあるように関数以前に問題がありそうなので調べてみます。
解決したようですが、その結果と照らし合わせて、「調べた結果」を評価するとどうでしょう。
結果的に検索した際に出てきたことと似たようなことが原因でした。
助言を頂きありがとうございました。

回答2件
あなたの回答
tips
プレビュー