質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

14817閲覧

mallocの呼び出し失敗

abeno2365

総合スコア25

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/08/15 01:50

以下の関数を実行すると呼び出しに失敗します。
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itagagaki

2021/08/15 02:03 編集

失礼。撤回します。
thkana

2021/08/15 02:10

> 他の方の質問を見ても こういうときの定石は「エラーメッセージそのままで検索する」ことかと思います。 'malloc(): corrupted top size'で検索した結果を見てもヒントになりませんか?
abeno2365

2021/08/15 02:20

回答いただきありがとうございます malloc(): corrupted top sizeで調べても、確保したメモリがアクセス時に漏れている場合ばかりで、確保時にエラーになることが書かれていないです。 他の方の指摘にもあるように関数以前に問題がありそうなので調べてみます。
thkana

2021/08/15 04:04

解決したようですが、その結果と照らし合わせて、「調べた結果」を評価するとどうでしょう。
abeno2365

2021/08/15 05:21

結果的に検索した際に出てきたことと似たようなことが原因でした。 助言を頂きありがとうございました。
guest

回答2

0

ベストアンサー

それは、メモリ破壊を当該 malloc 以前に起こしていて、それが malloc の管理領域に及んでいたため、malloc 呼び出し時に顕在化してる気配濃厚だと思います。
なので、malloc 呼び出し箇所だけ見てもなんの解決にもならないと思います。
プログラム全体に渡ってメモリ破壊を調べる手立てを講じた方が良いでしょう。

投稿2021/08/15 02:03

angel_p_57

総合スコア1681

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abeno2365

2021/08/15 02:24

回答いただきありがとうございます。 関数以前にもメモリをいろいろ確保しているので、そのあたりが原因かもしれません。 問題のmalloc以前にメモリの破壊が起きていないかを調べてみます。
abeno2365

2021/08/15 02:48

回答いただいた通り、ほかの場所でメモリの確保量が少なくて破壊されていました。 調べるヒントを与えていただきありがとうございました。
guest

0

malloc でのメモリ確保失敗は、NULLを返す、だけです。
そこで落ちたりしません

なにか別のところでアクセス違反が起こり、そのせいで落ちている、ってことではないかと。

投稿2021/08/15 01:57

y_waiwai

総合スコア88163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abeno2365

2021/08/15 02:21

回答いただきありがとうございます。 他の場所ですでにメモリーが破壊されていないか調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問