• ベストアンサー

Run-Timeエラーの原因に関して教えてください。

皆様、いつもありがとうございます。 C言語で教えてください。 プログラムを実行すると、下記内容のエラーが発生します。 Run-Time Check Failure #2 - Stack arround the variable 'wk_date' was corrupted 発生場所までは、突き止めましたが、原因が釈然としません。 wk_dateとwk_timeをstaticをつけて定義すると、このエラーが 出ないことから、strcpyの関数でのポインターのトラブル?だと 思うのですが、下記のロジックでおかしい箇所はあるでしょうか? ロジックは、現在の日付と時刻をudateに入れて返すだけです。 static char udate[15]; : : init() { char wk_date[9]; char wk_time[7]; time_t current; struct tm *local; time(¤t); /* 現在の時刻を取得 */ local = localtime(¤t); /* 地方時の構造体に変換 */ local->tm_year +=1900; local->tm_mon +=1; memset((char*)wk_date, NULL, sizeof(wk_date)); memset((char*)wk_time, NULL, sizeof(wk_time)); sprintf((char*)wk_date, "%04d%02d%02d", local->tm_year, local->tm_mon, local->tm_mday); printf("%s\n", wk_date); sprintf((char*)wk_time, "%02d%02d%02d", local->tm_hour, local->tm_min, local->tm_sec); printf("%s\n", wk_time); memset((char*)udate, NULL, sizeof(udate)); strcpy((char*)udate, strcat((char*)wk_date, (char*)wk_time)); return(0); } 納得のいく、説明を頂ければ幸いです。宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

strcatを行う際に、文字列を結合した結果が収まるだけの充分な領域がありません。領域が足らずにメモリを破壊しています。 strcpy((char*)udate, strcat((char*)wk_date, (char*)wk_time)); の行でstrcatを行う場合、結合先、つまりwk_dateに連結後の文字列が収まるだけの充分な領域が必要です。 strcat((char*)wk_date, (char*)wk_time) を行うには、wk_dateには、年4桁、月2桁、日2桁、時2桁、分2桁、秒2桁、ターミネータの'\0'が入るだけの、つまり、15バイトの領域が必要です。 ところが、 char wk_date[9]; と、9バイトしか確保されていません。これではwk_dateの後ろ10バイト目以降のメモリが破壊されます。 宣言部で char wk_date[15]; のようにwk_dateに充分な領域を与えて下さい。 なお、wk_dateをstaticに置くと「スタック上のワークや関数の戻り先を破壊して致命的暴走を引き起こすようなプログラムが実行されないようにする、ランタイムチェックルーチン」が呼ばれない為、単純にスタティック用データメモリの一部を破壊して終るだけなので、ランタイムエラーは起きません。未使用のメモリか、他の何かが使っているメモリを壊すだけなので、多分、バグに気付かないでしょう。 宣言部を char wk_date[9]; のままにしたい場合は、 strcpy((char*)udate, strcat((char*)wk_date, (char*)wk_time)); を strcpy((char*)udate,(char*)wk_date); strcat((char*)udate,(char*)wk_time); に直しましょう。 udateはstrcatが可能なだけの領域が static char udate[15]; として宣言されているので、正しく動きます。

lamina
質問者

お礼

回答頂きましてありがとうございました。 詳細な説明、大変わかりやすく感謝いたしております。 strcat関数の意味を間違えていることが、そもそもの 原因でした。またstaticに置く場合のランタイムチェックルーチンの 有無も知るいい機械になりました!ありがとうございましたm(__)m 納得いたしました(回答もありがとうございました!)。

その他の回答 (4)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.5

> どこかそのようになっておりますか? ここですね。 local->tm_year +=1900; local->tm_mon +=1; このlocalポインタの参照先も、新規のものを返してくれるわけではなく、 内部のものの使いまわしが渡されますので、その結果を直接+=などすると破壊します。 変更したい場合やとっておきたい場合などは、自分で一度別の変数にコピーする必要があります。 # 一般に、CのAPI等で新規のポインタを返してくれるものはごくわずかです。 # その場合、呼び出し側でfreeの必要に迫られます。

lamina
質問者

お礼

回答ありがとうございました! わかりました!云われてみて、確かにそうでした。。。 今後は、このあたりを注意しながら、今後のコーディングの 参考にさせて頂きます。大変勉強になりました。 今後とも宜しくお願いいたします。

回答No.4

再び#3です。 localtime()の戻す値は内部領域を指すポインタです。 struct tm * localは、ポインタ変数です。 ポイント変数にポインタを代入しているだけですから、 localはlocaltime()の内部領域を指してしまいます。 つまり、local->tm_year += 1900は内部領域を書き換えています。 struct tm * local, local2; local = localtime(& current); local->tm_year += 1900; local2 = localtime(& current); printf("local:%p, local2:%p, local->tm_year:%d\n", local, local2, local->tm_year); とすると、localとlocal2が同じ値になっていて、local->tm_yearが1900足す前の値に戻っていることが確認できると思います。

回答No.3

よく読んでいませんが、その大仰な文字列処理の大半はstrftime()を使うとtime()関数とあわせて簡潔に書けてしまう気がします。 それから、localtime()が戻すstruct tm *は関数の内部領域ですので、そこを書き換えてしまうのは大変危険です。 また、同じ理由でlocaltime()はマルチスレッド環境では使えない関数です。 もう一つついでに、memset()の第二引き数はint型のパラメータを要求しますからポインタを表すNULLを使うのは意味的には間違いです。

lamina
質問者

お礼

回答頂きましてありがとうございました。 >localtime()が戻すstruct tm *は関数の内部領域ですので、そこを書き換えてしまうのは大変危険です。 ひとつ教えてください。私自身、このコーディング上で書き換えているという意識は無いのですが、どこかそのようになっておりますか?それとも一般的な話としてでしょうか? >localtime()はマルチスレッド環境では使えない関数です。 知りませんでした、ありがとうございます。 >memset()の第二引き数はint型のパラメータを要求しますからポインタを表すNULLを使うのは意味的には間違いです。 云われてみてそうですね。今までずっとこのように記述していました。 ありがとうございました。またよろしくお願いします!

  • keibou21
  • ベストアンサー率31% (18/58)
回答No.1

strcpy((char*)udate, strcat((char*)wk_date, (char*)wk_time)); このstrcat()の第一引数でwk_dateを渡しているので wk_dateの文字列の後ろにwk_timeが連結されます。 wk_dateの領域が9バイトしかとっていないので連結を実行した 時点で確保した領域外を書きつぶしています。 それでエラーが出ているのでしょう。 #staticにするとエラーが出ないのは"たまたま"です。

lamina
質問者

お礼

回答頂きましてありがとうございました。 wk_dateの文字列の後ろに、wk_timeが連結されるのですね! てっきりwk_dateとwk_timeを連結した結果のポインターを 返すものと思い込んでおりました。 納得いたしました(^^

関連するQ&A

  • C言語のtime_tに関して

    こんにちは。 今現在、C言語にてプログラミングを行っております。time_tを用いましたが、4月などの2桁目が0のは巧く取得できたのですが、日にちの2桁目が0にならず、空白となってしまいます。 一応、ソースを載せておきますが見辛いのが申し訳ないです。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> time_t timer; struct tm *local; struct tm *utc; extern char today[20]; extern char today2[20]; extern char today_year[10]; extern char today_month[2]; extern char today_day[2]; void day(){ char *ptr; /* 現在時刻を取得 */ timer = time(NULL); local = localtime(&timer); /* 地方時に変換 */ /* 地方時 変換後表示 */ printf("地方時: "); printf("%4d/", local->tm_year + 1900); printf("%2d/", local->tm_mon + 1); printf("%2d ", local->tm_mday); if(local->tm_mday<10) //system("pause"); // printf("%2d:", local->tm_hour); // printf("%2d:", local->tm_min); // printf("%2d", local->tm_sec); // printf(" %d\n", local->tm_isdst); /*****************************/ sprintf(today_year,"%4d", local->tm_year + 1900); sprintf(today_month,"%2d", local->tm_mon + 1); sprintf(today_day,"%2d", local->tm_mday); if((local->tm_mon+1)<=9) today_month[0]='0'; if((local->tm_mday+1)<=9) today_day[0]='0'; sprintf(today, "%s-%s-%s", today_year, today_month, today_day); sprintf(today2, "%s/%s/%s", today_year, today_month, today_day); //printf("%s",today); /*****************************/ // utc = gmtime(&timer); /* 協定世界時(UTC)に変換 */ /* 協定世界時 変換後表示 */ // printf("\n\n\n\n協定世界時: "); // printf("%4d/", utc->tm_year + 1900); // printf("%2d/", utc->tm_mon + 1); // printf("%2d ", utc->tm_mday); // printf("%2d:", utc->tm_hour); // printf("%2d:", utc->tm_min); // printf("%2d", utc->tm_sec); // printf(" %d\n", utc->tm_isdst); return; } どなたかご教示下さい。

  • エラーがわかりません、、

    以下のプログラムを入力したときに以下のえらーがでます。 List13-4.c: In function ‘get_data’: List13-4.c:18: error: expected expression before ‘)’ token 18行目を探すのですが、自力では見つけられません。もしかしたら 別のところが間違っていて18行目がエラーと出ているのかなと思っています。ならいたてですぐにわかるようなミスかもしれないですが、よろしくお願いします。 #include <stdio.h> #include <time.h> char data_file[] = "datetime.data"; void get_data(void) { FILE *fp; if((fp = fopen(data_file,"r")) == NULL){ printf("本プログラムを実行するのは初めてですね\n"); } else{ int year,month,day,h,m,s; fscanf(fp,"%d %d %d %d %d %d",&year,&month,&day,&h,&m,&s); printf("前回は%d年%d月%d日%d時%d分%d秒でした\n",year,month,day,h,m,s,); fclose(fp); } } void put_data(void) { FILE *fp; time_t t; struct tm *local; time(&t); local = localtime(&t); if((fp = fopen(data_file,"w")) == NULL) printf("\aファイルをオープンできません\n"); else{ fprintf(fp,"%d %d %d %d %d %d\n", local->tm_year + 1900,local->tm_mon + 1 ,local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec); fclose(fp); } } int main(void) { get_data(); put_data(); return(0); }

  • Perlでの Timeの足し算

    時間の足し算をやりたい。訳あってライブラリが使えません。 方法は無いでしょうか? 仮にライブラリが使えるなら、下記のようでうまく行っています。 --------------------------------------------------- use Time::Local; $year=2008; $mon =10; $mday=24; $hours = 23; $min = 0; $sec = 0; $time = timelocal($sec, $min, $hours, $mday, $mon - 1, $year); $a1=($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time ); $mytimeORG= sprintf("%04d/%02d/%02d %2d:%2d", $year + 1900, $mon +1, $mday,$hour,$min); print "$mytimeORG\n"; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time + 32400); #9H加算 $mytime9H= sprintf("%04d/%02d/%02d %02d:%02d", $year + 1900, $mon +1, $mday,$hour,$min); print "$mytime9H\n"; ---------------------------------------------

    • ベストアンサー
    • Perl
  • Cモジュールが落ちる現象について

    お世話になっております。 現在、C言語でモジュールを作成しているのですが、 下記の関数の箇所でたまにこけるということがわかりました。 この関数のどこでこけているかまでは、判断できていないのですが、 皆様のお力をお貸しいただけないでしょうか。 【ソース概要】 本モジュールはオブジェクトの監視に使用するものなのですが、 設定ファイルより、そのオブジェクトの監視時間帯を確認する関数です。 関数の引数として監視対象オブジェクト名を渡します。 また、本関数を実行するCモジュールは、異なる引数で同時に複数回実行されます。 【設定ファイル内容】 確認日付(曜日) オブジェクト名 監視開始時間1 監視終了時間1 監視開始時間2 監視終了時間2 0415 オブジェクト名 000000 040000 051500 240000   ⇒4月15日はオブジェクトを0時0分0秒から4時0分0秒までと、5時15分00秒から24時00分00秒まで監視する 0 オブジェクト名 000000 040000 051500 240000   ⇒0(日曜日)はオブジェクトを0時0分0秒から4時0分0秒までと、5時15分00秒から24時00分00秒まで監視する 【ソース】 int kansiqmcheck(char Object[256]){ FILE *fp ; time_t t; struct tm *ck_time ; char cktm[5],ckwk[4],line[256],ln[256],mes[512],obj[256] ; int rc=0 , nowtime=0, RC=0 , i ; char *ckdt[6] ; /* 変数初期化など */ memcpy(obj,0,sizeof(obj)); strcpy(obj,Object); memcpy(line,0,sizeof(line)); t=time(NULL); ck_time = localtime(&t); sprintf(cktm,"%02d%02d",ck_time->tm_mon + 1,ck_time->tm_mday); sprintf(ckwk,"%d ",ck_time->tm_wday); strcat(obj," "); for(i=0 ; i < 6 ; i++){ ckdt[i] = NULL; } /* 監視設定ファイルオープン */ if((fp = fopen(CHECKTIMEFILE,"r")) == NULL ){ memcpy(mes,0,sizeof(mes)); sprintf(mes,"%s: CheckTimeFileOpenError:%s" , Targ , CHECKTIMEFILE) ; log_out(mes); exit(1) ; } /* 監視設定ファイルより監視対象オブジェクトの当日の監視に関する情報を取得 */ while(fgets(line,256,fp)!=NULL) { if(strncmp(line,cktm,strlen(cktm)) == 0 && strstr(line,obj) != NULL){ rc=1; break ; }else if(strncmp(line,ckwk,strlen(ckwk)) == 0 && strstr(line,obj) != NULL){ rc=1; break ; } memcpy(line,0,sizeof(line)); } fclose(fp) ; fp = NULL ; /* 監視オブジェクトより、現時刻が監視時間帯に該当するか確認 */ if(strlen(line) > 2 ){ memcpy(ln,0,sizeof(ln)); strncpy(ln,line,strlen(line) - 1 ); i=0; ckdt[i] = strtok(ln," \n\0"); while(ckdt[i] != NULL || i < 6){ i++ ; ckdt[i] = strtok(NULL," \n\0"); } if( i < 2 ){ memcpy(mes,0,sizeof(mes)); sprintf(mes,"%s: CheckTimeInfoError(obj):%s %s %d" , Targ , CHECKTIMEFILE , line , i) ; log_out(mes) ; return; } while(1){ t=time(NULL); ck_time = localtime(&t); nowtime = ck_time->tm_hour * 10000 + ck_time->tm_min * 100 + ck_time->tm_sec ; for( i = 2 ; ckdt[i] != NULL ; i=i+2 ){ if( nowtime > atoi(ckdt[i]) && nowtime < atoi(ckdt[i+1]) ){ rc=0; break ; } } if( nowtime >= atoi(ckdt[i]) && nowtime < atoi(ckdt[i+1]) ){ rc=0; break ; } /* エラーログ確認用 */ if( strcmp(Targ,"ELG") == 0 ){ RC=1; } memcpy(mes,0,sizeof(mes)); sprintf(mes,"%s: 監視スキップ:%s" , Targ , obj ) ; log_out(mes); sleep(10); if(checkstat() != 0 ){ break ; } } } return(RC); }

  • C言語のエラー処理について

    下記のコードを作成したのですが、入力エラーの際に出力される表示が意図した input error の出力と違う形で表示されてしまい、修正方法が分からず、どなたか教えて頂けないでしょうか? ・『あ』等の整数以外の文字が入力された時 input errorinput errorinput error ・/0が入力された時 input error input error input error 「ソースコード」 #include <stdio.h> #include <time.h> #include <string.h> #include <stdlib.h> #define CALC (3) #define FROM_YEAR (1900) #define MAX_LINE (1000) #define MAX_ROW (1000) float calc_proc(int* n1, char op, int n2, float* ans) { switch (op) { case '+': *ans = (float)*n1 + n2; break; case '-': *ans = (float)*n1 - n2; break; case '*': *ans = (float)*n1 * n2; break; case '/': if (n2 == 0) { puts("input error"); return 1; } *ans = (float)(float)*n1 / n2; break; default: printf("input error"); return 1; break; } return 0; } int cmp_u(const void* a, const void* d) { return strcmp((char*)a, (char*)d); } int cmp_d(const void* a, const void* d) { return strcmp((char*)d, (char*)a); } int main() { int num1, num2; char op; float answer; int i; FILE* fp; char e[11]; char sin[MAX_LINE][MAX_ROW]; char ad[8]; fp = fopen("log.txt", "a+"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } while (1) { scanf("%d%c%d", &num1, &op, &num2); calc_proc(&num1, op, num2, &answer); if (calc_proc(&num1, op, num2, &answer) != 0) { puts("input error"); return 1; } time_t t = time(NULL); struct tm* tm = localtime(&t); printf("%d/%02d/%02d ", tm->tm_year + FROM_YEAR, tm->tm_mon + 1, tm->tm_mday); printf("%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec); printf("%d%c%d,%f\n", num1, op, num2, answer); fprintf(fp, "%d/%02d/%02d ", tm->tm_year + FROM_YEAR, tm->tm_mon + 1, tm->tm_mday); fprintf(fp, "%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec); fprintf(fp, "%d%c%d,%f\n", num1, op, num2, answer); printf("計算を続けますか?"); scanf("%s", e); if (strcmp(e, "no") == 0) { break ; } } fclose(fp); fp = fopen("log.txt", "r"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } int cnt = 0; for (i = 0;i < MAX_LINE;i = i + 1) { if (fgets(sin[i], sizeof(sin[0]), fp)) ++cnt; else break; } fclose(fp); printf("ASC or DESC: "); scanf("%s", ad); if (strcmp(ad, "ASC") == 0) { qsort(sin, cnt, sizeof(sin[0]), cmp_u); } else { qsort(sin, cnt, sizeof(sin[0]), cmp_d); } for (i = 0;i < cnt;i = i + 1) { printf("%s", sin[i]); } return 0; }

  • C言語のqsortについて

    現在、qsortのコードに取り組んでいます。 if (strcmp(ad, "ASC") == 0) { qsort(sin, sizeof(cnt), sizeof(sin[0]), cmp_u); } else { qsort(sin, sizeof(cnt), sizeof(sin[0]), cmp_d); } 恐らくこちらのqsortでの第二引数が書き方を間違えていると思うのですが、修正の方法が分からず、どなたか教えて頂けないでしょうか? #include <stdio.h> #include <time.h> #include <string.h> #include <stdlib.h> static char ad[10]; int cmp_u(const void* a, const void* d) { return strcmp((char*)a, (char*)d); } int cmp_d(const void* a, const void* d) { return strcmp((char*)d, (char*)a); } int main() { int num1, num2; char op; float answer; int r,i; FILE* fp; char c[11]; char sin[1000][1000]; char ad[8]; fp = fopen("log.txt", "a+"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } while (1) { r = scanf("%d%c%d", &num1, &op, &num2); if (r != 3) { puts("input error"); return 1; } if (op == '+') { answer = num1 + num2; } else if (op == '-') { answer = num1 - num2; } else if (op == '*') { answer = num1 * num2; } else if (op == '/') { answer = (float)num1 / num2; } time_t t = time(NULL); struct tm* tm = localtime(&t); printf("%d/%02d/%02d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); printf("%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec); printf("%d%c%d,%f\n", num1, op, num2, answer); fprintf(fp, "%d/%02d/%02d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); fprintf(fp, "%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec); fprintf(fp, "%d%c%d,%f\n", num1, op, num2, answer); printf("計算を続けますか?"); scanf("%s\n", &c); if (strcmp(c, "no") == 0) { break ; } } fclose(fp); fp = fopen("log.txt", "r"); int cnt = 0; for (i = 0;i < 1000;i = i + 1) { if (fgets(sin[i], sizeof(sin[0]), fp)) ++cnt; else break; } fclose(fp); printf("ASC or DESC: "); scanf("%s", ad); if (strcmp(ad, "ASC") == 0) { qsort(sin, sizeof(cnt), sizeof(sin[0]), cmp_u); } else { qsort(sin, sizeof(cnt), sizeof(sin[0]), cmp_d); } for (i = 0;i < cnt;i = i + 1) { printf("%s", sin[i]); } return 0; }

  • 現在時刻をミリ秒まで取得

    お疲れ様です 現在時刻をミリ秒まで取得がしたいです。 今はtime_tを使って秒までは取得したのですがミリ秒は構造体にないらしく同じようにとってはこれないのでしょうか? また別のやり方だとどんなのがあるか教えてください。 現在は下記のように取得してyyyymmddhhmmssの形を作ってます。 これをyyyymmddhhmmsssssのようにミリ秒を増やしたたいのです。 長くなってしまいましたがよろしくお願いします time_t timer; time(&timer);/* 現在の時刻を取得 */ struct tm *local; local =localtime(&timer);/* 地方時の構造体に変換 */ CString time; //CString用の時間 time.Format("%4d%02d%02d%02d%02d%02d" ,local->tm_year + 1900,/* 年 */ local->tm_mon+1,/*月は0から始まるので1を+*/ local->tm_mday,/* 日 */ local->tm_hour,/* 時 */ local->tm_min,/* 分 */ local->tm_sec);/* 秒 */

  • このソースがコンパイルエラーになってしまいます

    このソースのどこがわるいのかわかりません エラー時にこのようなエラーメッセージが出ます In function `writedata': 52: error: syntax error before string constant 65: error: syntax error before string constant 89:2: warning: no newline at end of file ソースはこれです #include <stdio.h> #include <string.h> #include <time.h> typedef struct { int day; double dist; char comment[32]; } diary; void writedata(char datafile[]); void viewdata(char datafile[]); char datadir[] = "dat/"; int year,month,day; int main(int argc,char *argv[]) { char datafile[11]; struct tm *date; time_t now; now = time(NULL); date = localtime(&now); year = date->tm_year + 1900; month = date->tm_mon + 1; day = date->tm_mday; sprintf(datafile,"walk%04d%02d",year,month); if((argc > 1) && (strcmp(argv[1],"-view")==0)) { viewdata(datafile); } else { writedata(datafile); } return 0; } void writedata(char datafile[]) { diary today_data; FILE *outfp; char y_n = 'n'; char filename[15]; char input_str[12]; printf("%d/%d/%dの記録をしますか?(y/n) > ",year,month,day); scanf("%c", &y_n); while(getchar() != '\n') { } if(y_n != 'y') { printf("記録する日付は?(例:%d %d %d) > ",year,month,day); year = 0; month = 0; day = 0; gets(input_str); sscanf(input_str"%d %d %d",&year,&month,&day); if((year > 9999) || (month > 12) || (month < 1) || (day > 31)|| (day < 1)) { printf("日付が正しくありません\n"); return; } sprintf(datafile,"walk%04d%02d",year,month); } today_data.day = day; printf("距離は? >"); scanf("%lf", &today_data.dist); while(getchar() != '\n') { } printf"コメントは?(30文字以内) >"); fgets(today_data.comment, 32, stdin); if((strlen(today_data.comment) == 31) && (today_data.comment[30] != '\n')) { while (getchar() != '\n') { } } sprintf(filename, "%s%s",datadir,datafile); if((outfp = fopen(filename,"a+")) == NULL) { printf("ファイルオープンエラー\n"); return; } fprintf(outfp , "%d %.2lf", today_data.day,today_data.dist); if((strlen(today_data.comment) == 31) && (today_data.comment[30] != '\n')) { today_data.comment[30] = '\n'; today_data.comment[31] = '\0'; } fprintf(outfp,"%s",today_data.comment); fclose(outfp); printf("記録しました"); } void viewdata(char datafile[]) { } なぜ、エラーになったか教えてくださいお願いします

  • 曜日を格納する配列の大きさ

    細々と半年ほど柴田望洋氏の「明解C言語 入門編」でC言語の勉強をしております。 最近構造体について勉強しはじめ、プログラム実行時の日付を出力するプログラムがテキストに載っていて、以下がその関数です。 void put_date(void) { time_t current; struct tm *local; char wday_name[][3] = { "日", "月", "火", "水", "木", "金", "土" }; /*-- [][3]?? --*/ time(&current); local = localtime(&current); printf("%4d年%02d月%02d日(%s)", local->tm_year + 1900, local->tm_mon + 1, local->tm_mday, wday_name[local->tm_wday]); } これの曜日を格納する配列wday_name[][3]は、どうしてこのような宣言をするのでしょうか? wday_name[][7]にすると何か間違っているのですか? 自分で後者の方で実行してみたところ、特に動作に違いは見られませんでした。 どうぞよろしくお願い致します。

  • newとdeleteでのアサート

    C++とViasulC++2003にて、 現在時刻を取得する関数を作成しているのですが、 以下のようなアサートが表示され強制終了してしまいます。 > _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) おそらくnewとdeleteあたりで発生しているのは確かなのですが、 その原因が解らずにこまっています。 どうか、アドバイスをよろしくお願いします。 プログラムのソースは以下の通りです。 #include <time.h> void get_date( int *year, int *mon, int *day, int *week ){ tm *mytime = new tm(); time_t long_time; time( &long_time ); mytime = localtime( &long_time ); *year = mytime->tm_year + 1900; *mon = mytime->tm_mon + 1; *day = mytime->tm_mday; *week = mytime->tm_wday; delete mytime; mytime = NULL; } int main(){ int y, m, d, w; get_date( &y, &m, &d, &w ); }

専門家に質問してみよう