プログラムの作成をしたのですが、
自宅(VisualC++)だと実行できるのに、
学校の端末(OSしかわかりませんが、UNIXです。)
だと、core dumpedしてしまいます。
どういう原因が考えられるでしょうか?
プログラムソースは次の通りです。
――――――――――――――――――――――――――
#include<stdio.h>
#include<stdlib.h>
char *strtok(char *moji, char cc);
void main()
{
char moji[200];
char kugiri[10];
char *cp;
printf("文字列を入力してください\n");
scanf("%s",moji);
printf("区切り文字を入力してください\n");
scanf("%s",kugiri);
cp=strtok(moji,kugiri[0]);
printf("取り出した文字列は%s\n",cp);
while(cp!=NULL){
cp=strtok(NULL,kugiri[0]);
printf("取り出した文字列は%s\n",cp);
}
}
char *strtok(char *moji,char cc)
{
int len;
char *cp1,*cp2;
char *mem;
static char *moji_old;
if(moji==NULL){
moji=moji_old;
}
len=0;
cp1=moji;
while(*cp1!='\0'){
len++;
cp1++;
}
mem=malloc(len+3);
if(mem==NULL){
puts("メモリが足りません\n");
return NULL;
}
cp1=moji;
cp2=mem;
while(*cp1!=cc && *cp1!='\0'){
*cp2=*cp1;
cp1++;
cp2++;
}
free(mem);
if(*cp1=='\0'){
moji_old=cp1;
mem=NULL;
}
else{
moji_old=cp1+1;
*cp2='\0';
}
return mem;
}
――――――――――――――――――――――――――
以上です。
No.4ベストアンサー
- 回答日時:
落ちているところは、
while(cp!=NULL){
cp=strtok(NULL,kugiri[0]);
printf("取り出した文字列は%s\n",cp);←ここです。
}
strtok()関数がバグっています。
入力した文字列の最後に;がないので、
if(*cp1=='\0'){
moji_old=cp1;
mem=NULL;
}
最後の'lmn'がこの判定に入ってしまい、NULLをリターンします。
このNULLをprintfで表示しようとするので、coredumpとなります。
回避は、この分岐内でも、'mem=NULL;'ではなく'*cp2='\0';'としましょう。
他の方が指摘しているfreeした後にメモリを利用しても、ポインタは消えないので事実上問題はありません。
プログラムとしてはよろしくありませんが...
No.6
- 回答日時:
#include <stdio.h>
#include <stdlib.h>
main()
{
static char *aa;
aa = malloc(5);
strcpy(aa, "abc");
free(aa);
printf("%s\n", aa);
sleep(2);
strcat(aa, "de");
printf("%s\n", aa);
sleep(2);
aa = NULL;
printf("%s\n", aa);
}
と書くと、abcと表示し、2秒後にabcdeと表示し、2秒後にcoredumpしますよ。
因みにgdbの内容
(gdb) where
#0 0xef723d50 in strlen ()
#1 0xef761f8c in _doprnt ()
#2 0xef76ad60 in printf ()
#3 0x10a00 in main () at b.c:21
(gdb) list 21
16 strcat(aa, "de");
17 printf("%s\n", aa);
18
19 sleep(2);
20 aa = NULL;
21 printf("%s\n", aa);
22 }
solarisで純正コンパイラ。
linux gcc では、coredumpせずに(nul)と表示してくれますね。
No.5
- 回答日時:
う~ん、、、
core dumpの理由は、strtok()内で
mem=malloc();した後、cp2=mem;と代入してますね。
その後、free(mem);を実行しておきながら、
*cp2='\0';をやってますね。
このとき*cp2(mem)がallocateしていたメモリ
開放されています。
だから、Segmentation Faultなのです。
つまり、「アクセスしてはいけない領域に
アクセスしようとした」のです。
*cp2='\0';とやっても、free(mem);をする以上、
Segmentation Faultです。
よって、ある意味、mem=NULLは正しいともいえます。
また、printf("%s", NULL);ではエラーは発生しませんよ!
全く問題なく正常に動作します。
VCで動くのはWindowsとVCのメモリ管理が
杜撰すぎるだけです。
No.3
- 回答日時:
ここでmemfreeしちゃだめです。
その後で*cp2='\0';をしてるので、ここで
SegmentationFaultが発生します。
また、return mem;をする場合は、呼び出し先で
メモリ開放しちゃだめです。
また、moji_oldもできるだけstrtok内でalloc/free
し、アドレスの代入ではなくメモリーコピーしましょう。
No.1
- 回答日時:
今Linux上でコンパイルして実行してみたのですが特に
core dump しません...
core dumpする時に入力データとして何をわたしていますか?
あと、学校の端末で
gcc -g -o strtest strtest.c
gdb strtest
等としてソースコードレベルでデバッグするとわかるかと思います。
OSは、uname -a とかするとわかると思います。
この回答への補足
実行時に表示されるのは次の通りです。
nagatsuki% report2
文字列を入力してください
bcde;efgh;;ijk;;lmn
区切り文字を入力してください
;
取り出した文字列はbcde
取り出した文字列はefgh
取り出した文字列は
取り出した文字列はijk
取り出した文字列は
Segmentation fault (core dumped)
以上です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- 電気工事士 【電気設備設計士さんに液晶パネルタイプの電力量計に関する質問です】キュービクル内の液晶 1 2023/07/24 18:16
- 中学校 CP室 3 2023/02/10 23:33
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
エラーについて質問です。
-
char型2つを結合し、short型に...
-
#defineが使用するメモリ領域に...
-
終了条件Ctrl+zについて,結果表...
-
C言語でのCSVファイルの読み出...
-
char型をfloat型に変換
-
C言語のプログラムで、途中で止...
-
fwrite処理について
-
C言語について
-
矢印キーを押下してコンソール...
-
構造体をディスクからロードし...
-
ファイルから数字列を16進数の...
-
空白を含んだ文字列がうまく格...
-
文字列の入力
-
プログラムが動きません。
-
大文字を小文字に変換するプロ...
-
#include <stdio.h> #include <...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
#defineが使用するメモリ領域に...
-
C言語のプログラムで、途中で止...
-
printf による16進表示について
-
空白を含んだ文字列がうまく格...
-
プログラミングの授業の課題です
-
【C言語】全角文字の配列を、全...
-
構造体メンバの初期化
-
Cでファイルの行数をカウントす...
-
char型2つを結合し、short型に...
-
矢印キーを押下してコンソール...
-
C言語で複数列のデータを1列の...
-
終了条件Ctrl+zについて,結果表...
-
Ç言語でファイルサイズを変更す...
-
エラーについて質問です。
-
C言語でのCSVファイルの読み出...
-
C++で指定文字列のカウント方法...
-
VC++でSQLへSELECT文を送ったの...
-
fscanfの使い方
-
c言語で文書を読み込み、単語の...
おすすめ情報