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

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

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

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

Q&A

解決済

1回答

443閲覧

C言語: 10進2進変換のプログラムでsegmentation faultが解決できない.

wataamenoarashi

総合スコア9

C

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

0グッド

1クリップ

投稿2020/10/16 15:12

プログラムの概要
10進数を2進数に変換して配列に逆順(一番初めの位が配列の0番目に来るよう)に格納する関数を作り、その関数をmain内で呼び出してポインタを介して配列の先頭から出力するプログラムを書こうとしています。

環境
macOS Catalina 10.15.7
C言語はccでコンパイルしてます。
cc --version
Apple clang version 12.0.0 (clang-1200.0.32.2)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

質問
下の①と②の部分をコメントアウトしないとどちらもsegmentation faultとなってしまいます。どこの部分でアクセスしてはいけないメモリにアクセスしているのかわかりません。①はreturn 0の有無だけでsegmentation faultが出てきたり、②は前に書いてあることをfor文にしているだけなのになんで動かないんだろうという感じです。

わかる方いましたら解決方法のヒントだけでも教えて頂けると助かります。

C言語

1#include <stdio.h> 2void toBinaryArray(int *binary, int *b_size, int n); 3 4int main(void) 5{ 6 int binary[100]; 7 int *b_size; 8 int n = 100; //n of 3^n 9 toBinaryArray(binary, b_size, n); 10 // int b_size2 = *b_size; 11 int i; 12 printf("%d\n", *b_size); 13 printf("%d\n", n); 14 printf("%d\n", binary[0]); 15 printf("%d\n", binary[1]); 16 printf("%d\n", binary[2]); 17 printf("%d\n", binary[3]); 18 printf("%d\n", binary[4]); 19 printf("%d\n", binary[5]); 20 printf("%d\n", binary[6]); 21 22 // for (i = 0; i < *b_size; i++) ① 23 // { 24 // // printf("i:%d\n", i); 25 // printf("%1d\n", binary[i]); 26 // } 27 putchar('\n'); 28 // return 0; ② 29} 30 31void toBinaryArray(int *binary, int *b_size, int n) 32{ 33 int i, j; 34 for (i = 0; n > 0; i++) 35 { 36 binary[i] = n % 2; 37 n = n / 2; 38 } 39 *b_size = i; 40 // printf("%d\n", i); 41 // for (j = 0; j < i; j++) 42 // { 43 // printf("%1d", binary[j]); 44 // } 45 // putchar('\n'); 46} 47

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

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

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

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

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

guest

回答1

0

ベストアンサー

diff

1- int* b_size; 2+ int b_size = 0; 3 4- toBinaryArray(binary, b_size, n); 5+ toBinaryArray(binary, &b_size, n); 6 7- printf("%d\n", *b_size); 8+ printf("%d\n", b_size); 9 10- for (i = 0; i < *b_size; i++) 11+ for (i = 0; i < b_size; i++)

どこの部分でアクセスしてはいけないメモリにアクセスしているのかわかりません。

未初期化のため不定値となっているポインタ変数b_sizeがさす先に読み書きしています。

投稿2020/10/16 15:27

編集2020/10/16 16:31
SHOMI

総合スコア4079

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

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

wataamenoarashi

2020/10/16 15:41

ありがとうございます!!!!! printfを先頭に入れてもsegfoしか帰ってこなかったりして全然気づけませんでした。数値持ってきたいときはポインタを定義するのではなく整数を定値で定義してそのポインタを送ってあげればいいということですね?
wataamenoarashi

2020/10/16 15:46 編集

しかしprinf(*b_size)ではちゃんと帰ってきてるんですよね… よろしければなぜ*b_sizeは帰ってこれるのか教えて頂けると嬉しいです
SHOMI

2020/10/16 16:34

たまたま動いているだけです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問