teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

追記

2021/02/28 14:25

投稿

退会済みユーザー
answer CHANGED
@@ -15,4 +15,6 @@
15
15
  fprintf(txt, "%fHz %d\n", fq, pw); /* エラー箇所 */
16
16
  }
17
17
  ```
18
- N固定でループ回してると、xのメモリ長<(N*sizeof(double)) の場合にバッファオーバーランすると思います。
18
+ N固定でループ回してると、xのメモリ長<(N*sizeof(double)) の場合にバッファオーバーランすると思います。
19
+
20
+ VisualStudioなら、デバッグ中にメニューのデバッグ⇒ウィンドウ⇒メモリで、ポインタのアドレスを打ち込んで直接メモリの中を覗けます。電卓で16進数表示でアドレス計算しながら、どこまで書き込まれたか実際に確認してみるとよいでしょう。

5

修正

2021/02/28 14:25

投稿

退会済みユーザー
answer CHANGED
@@ -15,4 +15,4 @@
15
15
  fprintf(txt, "%fHz %d\n", fq, pw); /* エラー箇所 */
16
16
  }
17
17
  ```
18
- N固定でループ回してると、xのメモリ長<N の場合にバッファオーバーランすると思います。
18
+ N固定でループ回してると、xのメモリ長<(N*sizeof(double)) の場合にバッファオーバーランすると思います。

4

修正

2021/02/28 13:57

投稿

退会済みユーザー
answer CHANGED
@@ -3,7 +3,7 @@
3
3
  ```C
4
4
  x = audio_read(&prm_in, fn);
5
5
  ```
6
- ここで戻ってきたxのメモリ長が、
6
+ ここで戻ってきたxのメモリ長は不明ですが、
7
7
 
8
8
  ```C
9
9
  for (i = 0; i < N; i++) {

3

修正

2021/02/28 13:51

投稿

退会済みユーザー
answer CHANGED
@@ -15,4 +15,4 @@
15
15
  fprintf(txt, "%fHz %d\n", fq, pw); /* エラー箇所 */
16
16
  }
17
17
  ```
18
- N固定でループ回してると、xのメモリ長>N の場合にバッファオーバーランすると思います。
18
+ N固定でループ回してると、xのメモリ長<N の場合にバッファオーバーランすると思います。

2

追記

2021/02/28 13:50

投稿

退会済みユーザー
answer CHANGED
@@ -1,1 +1,18 @@
1
- malloc,callocで確保したメモリ以上に書き込んでいるのでは。確保したメモリのサイズと、メモリにループで書き込んでる所をデバッグして突き合わせていくしかないですね。
1
+ malloc,callocで確保したメモリ以上に書き込んでいるのでは。確保したメモリのサイズと、メモリにループで書き込んでる所をデバッグして突き合わせていくしかないですね。
2
+
3
+ ```C
4
+ x = audio_read(&prm_in, fn);
5
+ ```
6
+ ここで戻ってきたxのメモリ長が、
7
+
8
+ ```C
9
+ for (i = 0; i < N; i++) {
10
+ if (x != NULL && y != NULL) {
11
+ pw = sqrt(x[i] * x[i] + y[i] * y[i]) * 100; // パワースペクトル
12
+ }
13
+ fq = i / (dt * Fr) * 2.2; // 周波数
14
+ //printf("%f = %d / (%f * %d)\n", fq, i, dt, N);
15
+ fprintf(txt, "%fHz %d\n", fq, pw); /* エラー箇所 */
16
+ }
17
+ ```
18
+ N固定でループ回してると、xのメモリ長>N の場合にバッファオーバーランすると思います。

1

修正

2021/02/28 13:49

投稿

退会済みユーザー
answer CHANGED
@@ -1,2 +1,1 @@
1
- デバッグしてステップ実行できるなら、とりあえずエラーが発生した行くらいは書きましょう。
2
1
  malloc,callocで確保したメモリ以上に書き込んでいるのでは。確保したメモリのサイズと、メモリにループで書き込んでる所をデバッグして突き合わせていくしかないですね。