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

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

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

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

Q&A

解決済

1回答

361閲覧

wavファイルの書き込みでAbort Trap:6

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2019/08/21 00:51

Cでwavファイルのヘッダーの書き込みを行おうとしたところ,実行時にAbort trap:6が発生しました.
strcpyでヘッダーの構造体のchar[4]にidを代入するところで起きているようです.今まで遭遇したことのないエラーであり,wavも初めて扱ったので対処法を教えていただけるとありがたいです.

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define FDATA "wavFData.txt" 6#define WAVOUT "sample2.wav" 7 8typedef struct{ 9 char id[4]; 10 unsigned long size; 11 char form[4]; 12} riff_chunk; 13 14typedef struct{ 15 char id[4]; 16 unsigned long size; 17 unsigned short format_id; 18 unsigned short channel; 19 unsigned long fs; 20 unsigned long byte_sec; 21 unsigned short byte_samp; 22 unsigned short bit; 23} fmt_chunk; 24 25typedef struct 26{ 27 char id[4]; 28 unsigned long size; 29} data_chunk; 30 31riff_chunk write_riff; 32fmt_chunk write_fmt; 33data_chunk write_data; 34 35int main(){ 36 FILE *readfp; 37 FILE *writefp; 38 short fdata; 39 40 readfp=fopen(FDATA,"r"); 41 if(readfp==NULL){ 42 printf("cannot open %s\n",FDATA); 43 exit(0); 44 } 45 46 writefp=fopen(WAVOUT,"w"); 47 if(writefp==NULL){ 48 printf("cannot open %s\n",WAVOUT); 49 exit(0); 50 } 51 52 53 54 55 strcpy(write_riff.id,"RIFF"); 56 write_riff.size=22042; 57 strcpy(write_riff.form,"WAVE"); 58 59 strcpy(write_fmt.id,"fmt "); 60 write_fmt.size=16; 61 write_fmt.format_id=1; 62 write_fmt.channel=1; 63 write_fmt.fs=11025; 64 write_fmt.byte_sec=22050; 65 write_fmt.byte_samp=2; 66 write_fmt.bit=16; 67 68 strcpy(write_data.id,"data"); 69 write_data.size=22050; 70 71 72 73 fwrite(write_riff.id,1,4,writefp); 74 fwrite(&write_riff.size,4,1,writefp); 75 fwrite(write_riff.form,1,4,writefp); 76 77 fwrite(write_fmt.id,1,4,writefp); 78 fwrite(&write_fmt.size,4,1,writefp); 79 fwrite(&write_fmt.format_id,2,1,writefp); 80 fwrite(&write_fmt.channel,2,1,writefp); 81 fwrite(&write_fmt.fs,4,1,writefp); 82 fwrite(&write_fmt.byte_sec,4,1,writefp); 83 fwrite(&write_fmt.byte_samp,2,1,writefp); 84 fwrite(&write_fmt.bit,2,1,writefp); 85 86 fwrite(write_data.id,1,4,writefp); 87 fwrite(&write_data.size,4,1,writefp); 88 89 for(int i=0;i<11025;i++){ 90 fread(&fdata,2,1,readfp); 91 fwrite(&fdata,2,1,writefp); 92 } 93 94 95 96 97 fclose(readfp); 98 fclose(writefp); 99 return 0; 100}

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

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

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

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

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

guest

回答1

0

ベストアンサー

strcpy(write_riff.id,"RIFF");

strcpyという関数は文字列のコピーをしてくれます
文字列、ということは、文字列終端の'\0'も一緒にコピーしてくれるということで、
このコードの場合、write_riff.idに5文字分のデータがコピーされるということになり、範囲外アクセスとなってしまいます

ということで、ここは文字列コピーではなく、単なるデータコピーを使いましょう
memcpy(write_riff.id,"RIFF",sizeof(write_riff.id));
でやってみよう。

#他の場所のstrcpyも同様に修正が必要

投稿2019/08/21 01:03

y_waiwai

総合スコア87719

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

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

退会済みユーザー

退会済みユーザー

2019/08/21 01:12

無事解決しました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問