前提・実現したいこと
C言語で動的配列をmallocを用いて作成し、全要素を合計するプログラムを作ろうとしました。
発生している問題・エラーメッセージ
はじめは、Ubuntuで実行してみましたが、コアダンプが発生しました。
原因がわからなかったので、windowsでもやってみたら問題なく動作しました。
ついでに、CentOSでもやってみたらUbuntuと同じようにコアダンプが発生しました。
デバッグで各行の間にprintf関数を入れてみました。どうやら
array[0][0] = 1;
の行以降は動いていないようです。
しかもWindowsでは動いてくれて、Linuxでだめだなんて。。
コンパイラの仕様による違いがあることはわかりますが、こんな基本的なところで違いがあるのか疑問に思いました。
長くなりましたが結論、Linux環境でも問題なく動くにはどこをコード修正したらいいか教えていただけたら幸いです。
[Ubuntuの実行結果]
test1 test2 test3 test4 Segmentation fault (コアダンプ)
[Windowsの実行結果]
test1 test2 test3 test4 test5 test6 test7 test8 A[0][0] = 1 A[0][1] = 2 A[1][0] = 3 A[1][1] = 4 ans=10 test9 forLoopTest[0][0] array[0][0] = 1 forLoopTest[0][1] array[0][1] = 2 forLoopTest[1][0] array[1][0] = 3 forLoopTest[1][1] array[1][1] = 4
[CentOSでの実行結果]
[Ubuntuの実行結果]とまったく同じ
該当のソースコード
C言語
1#include <stdio.h> 2#include <stdlib.h> 3 4void sumArray(int **A,int size); 5 6int main(void) { 7 int length = 2; 8 9 printf("test1\n"); 10 int **array; 11 printf("test2\n"); 12 array = (int**)malloc(sizeof(int) * length * length); 13 printf("test3\n"); 14 if(array == NULL) { 15 printf("error: malloc\n"); 16 } 17 18 printf("test4\n"); 19 array[0][0] = 1; 20 printf("test5\n"); 21 array[0][1] = 2; 22 printf("test6\n"); 23 array[1][0] = 3; 24 printf("test7\n"); 25 array[1][1] = 4; 26 27 printf("test8\n"); 28 sumArray(array,length); 29 printf("test9\n"); 30 31 int i,j; 32 for(i=0;i<length;i++) { 33 for(j=0;j<length;j++) { 34 printf("forLoopTest[%d][%d]\n",i,j); 35 printf("array[%d][%d] = %d\n",i,j,array[i][j]); 36 } 37 } 38 39 free(array); 40 return 0; 41} 42 43void sumArray(int **A,int size) { 44 int ans = 0; 45 int i,j; 46 for(i=0;i<size;i++) { 47 for(j=0;j<size;j++) { 48 printf("A[%d][%d] = %d\n",i,j,A[i][j]); 49 ans += A[i][j]; 50 } 51 } 52 printf("ans=%d\n",ans); 53 54 return; 55}
試したこと
調べてみて、動的構造体の場合は、Javaでいうインスタンス化のようなものが必要で多くの人がコアダンプで苦しめられているようでしたが、今回は配列だからインスタンス化しなくてもいいよね。と考えたりしました。
ただの配列への代入で、なぜコアダンプが起こるのかわかりません。
補足情報(FW/ツールのバージョンなど)
Ubuntu:
$ cc --version cc (Ubuntu 9.3.0-10ubuntu2) 9.3.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Windows:
>gcc --version gcc (MinGW.org GCC Build-20200227-1) 9.2.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
CentOS:
$ cc --version cc (GCC) 8.3.1 20191121 (Red Hat 8.3.1-5) Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
回答3件
あなたの回答
tips
プレビュー