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

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

ただいまの
回答率

87.50%

パスカルの三角形 MallocでOver flow がおきます。C言語

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 192

score 26

LeetCodeの問題でRuntime Errorが出ます。
アドバイスをいただけないでしょうか?
leetcodeの問題のリンクです

  • Return an array of arrays of size *returnSize.
  • The sizes of the arrays are returned as *returnColumnSizes array.
  • Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
int** generate(int numRows, int** returnColumnSizes, int* returnSize) {


    int **q, i, j;


    *returnSize = numRows;
    q = (int **) malloc (sizeof(int *) * numRows);


    for (i = 0; i < numRows; i++) {

        printf("%d\n",i);

        q[i] = (int *) malloc (sizeof(int) * (i + 1));
        q[i][0] = 1;
        q[i][i] = 1;

        if(i!=0){
            for(j=1; j<i; j++){
                q[i][j] = q[i-1][j-1] + q[i-1][j];
            }    
        }
    }

//この下の3行でエラーが出ています。
    *returnColumnSizes = (int *) malloc (sizeof(int) * numRows);
     for (i = 0; i < numRows; i++) 
         (*returnColumnSizes)[i] = i + 1;

    return q;  


}

//修正後のコード

int** generate(int numRows, int* returnSize , int** returnColumnSizes) {

    int **q, i, j;

    *returnSize = numRows;
    q = (int **) malloc (sizeof(int *) * numRows);
    *returnColumnSizes = (int *) malloc (sizeof(int) * numRows);


    for (i = 0; i < numRows; i++) {
        (*returnColumnSizes)[i] = i + 1;
        q[i] = (int *) malloc (sizeof(int) * (i + 1));
        q[i][0] = 1;
        q[i][i] = 1;   

        if(i!=0){
            for(j=1; j<i; j++){
                q[i][j] = q[i-1][j-1] + q[i-1][j];
            }    
        }   
    }

    return q;      
}
=================================================================
==32==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffece7f8470 at pc 0x557d430bf63e bp 0x7ffece7f83a0 sp 0x7ffece7f8390
WRITE of size 8 at 0x7ffece7f8470 thread T0
    #2 0x7f0d7e3130b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
Address 0x7ffece7f8470 is located in stack of thread T0 at offset 32 in frame
  This frame has 5 object(s):
    [32, 36) 'ret_size' <== Memory access at offset 32 partially overflows this variable
    [96, 104) 'nbytes'
    [160, 168) 'line'
    [224, 232) 'ret_colsize'
    [288, 292) 'SEPARATOR'
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
      (longjmp and C++ exceptions *are* supported)
Shadow bytes around the buggy address:
  0x100059cf7030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100059cf7040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100059cf7050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100059cf7060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100059cf7070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x100059cf7080: 00 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1[04]f2
  0x100059cf7090: f2 f2 f2 f2 f2 f2 00 f2 f2 f2 f2 f2 f2 f2 00 f2
  0x100059cf70a0: f2 f2 f2 f2 f2 f2 00 f2 f2 f2 f2 f2 f2 f2 04 f2
  0x100059cf70b0: f2 f2 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100059cf70c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100059cf70d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==32==ABORTING
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • BeatStar

    2021/09/26 18:44

    > アドバイスをいただけないでしょうか

    『デバッグしましょう』ですね。

    プログラミングは『書いて終わり』ではありません。
    デバッグやテストまで含みます。

    デバッグはプログラミングする上で当たり前の技術です。

    『C言語 デバッグ方法』とかで検索してください。

    キャンセル

  • alizona

    2021/09/26 18:48 編集

    テストケースのinput が5の場合
    numRows:0
    q[0][0]==1
    q[0][0]==1

    numRows:1
    q[1][0]==1
    q[1][1]==1

    numRows:2
    q[2][0]==1
    q[2][1]==2
    q[2][2]==1

    numRows:3
    q[3][0]==1
    q[3][1]==3
    q[3][2]==3
    q[3][3]==1

    numRows:4
    q[4][0]==1
    q[4][1]==4
    q[4][2]==6
    q[4][3]==4
    q[4][4]==1

    ここまではコメントで出力できてるのですが、
    *returnColumnSizes = (int *) malloc (sizeof(int) * numRows);
    for (i = 0; i < numRows; i++)
    (*returnColumnSizes)[i] = i + 1;
    この3行でover flow になります。
    returnColumnSizesをmallocできないので、プログラムが qの2次元配列をreturnしても、呼び出し先でouputされた時には、出力が [ ]となります。

    キャンセル

  • actorbug

    2021/09/26 18:55

    リンク先に行って言語をCに切り替えると、以下の定義が表示されます。ご質問のコードと引数の順番が違っているようですが、あえて変えているのでしょうか。
    int** generate(int numRows, int* returnSize, int** returnColumnSizes){

    キャンセル

  • alizona

    2021/09/26 19:04

    すみませんでした。引数の順番を変えたところleetcodeをパスしました。
    ありがとうございました。

    キャンセル

回答 1

check解決した方法

0

actorbug

リンク先に行って言語をCに切り替えると、以下の定義が表示されます。ご質問のコードと引数の順番が違っているようですが、あえて変えているのでしょうか。

引数の順番が間違えていました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る