【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22904

構造体の動的確保でセグメントエラー
投稿者---cunt(2005/08/30 21:39:20)


ディレクトリ内のファイル情報を構造体に格納するプログラムを作成しています。
50個ほどは適切にファイルを構造体に読み込んでいるのですが、途中で
Secmentation fault (core dumped)
というエラーが出ています。
ファイル名を格納する配列を50などと減らすと、多くのファイルを読み込むようにはなります。
しかし、このPCのメモリは256mなため、余裕で確保できると思ったのですが、確保の仕方がまずいのでしょうか。
reallocの行が怪しいと思ったのですが、解決することができませんでした。
もし間違っている記述などありましたら、教えていただけると幸いです。
以下はエラーの出た部分の最小限のプログラムです。


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<dirent.h>
#include<sys/types.h>
#include<sys/stat.h>
struct filein{
  char filename[129];
  int filesize;
  char filetime[25];
  char fileuname[9];
};

main(int argc, char *argv[])
{
  DIR *dir;
  struct filein *file_st;
  struct dirent *dp;
  int i=0;/*ルートとかの.を省く*/
  char path[512],chk;

  if(argc<=1) {
    strcpy(path,".");
  }
  else{
    strcpy(path,argv[1]);
  }
                                      
  if((dir=opendir(path))==NULL) {
    perror("opendir");
    exit(-1);
  }

  /*ファイル情報を構造体に格納*/
  file_st = (struct filein *)malloc(sizeof(struct filein) *1);
  for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)) {
    printf("%d ",i);
    file_st = (struct filein *)realloc(file_st,sizeof(struct filein) * i+1);
    strcpy(file_st[i].filename,dp->d_name);
    printf("%s",file_st[i].filename);
    printf("%s\n",dp->d_name);
    i++;
  }
  closedir(dir);
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体の動的確保でセグメントエラー 22906 まきじ 2005/08/30 22:00:09
<子記事> Re:構造体の動的確保でセグメントエラー 22907 Hermit 2005/08/30 22:16:13
<子記事> Re:構造体の動的確保でセグメントエラー 22918 cunt 2005/08/31 18:23:39


No.22906

Re:構造体の動的確保でセグメントエラー
投稿者---まきじ(2005/08/30 22:00:09)


int i=0;/*ルートとかの.を省く*/
file_st = (struct filein *)malloc(sizeof(struct filein) *1);
for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)) {
    file_st = (struct filein *)realloc(file_st,sizeof(struct filein) * i+1);
    i++;
}

一回目の realloc() の時、i は 0 なので i + 1 で要素数一個で、
i++ されて、file_st[1] に格納しようとしてるから。

realloc() するのは、一つ目のファイル情報を格納してからです。
一つ目は、file_st[0]に格納され、二つ目は file_st[1] に格納するには
要素数を二個に増やすので realloc() は、i++ の後。


この投稿にコメントする

削除パスワード

No.22909

Re:構造体の動的確保でセグメントエラー
投稿者---まきじ(2005/08/30 22:44:26)


>一回目の realloc() の時、i は 0 なので i + 1 で要素数一個で、
>i++ されて、file_st[1] に格納しようとしてるから。

これ違いますね・・・
Hermit さんも仰ってる様に、i + 1 に括弧が無いからです。

# realloc() のタイミングが変だから、上記の様な解釈になりました。
# 括弧付ければ、期待通りになるかと


この投稿にコメントする

削除パスワード

No.22907

Re:構造体の動的確保でセグメントエラー
投稿者---Hermit(2005/08/30 22:16:13)


file_st = (struct filein *)realloc(file_st,sizeof(struct filein) * (i+1));

最後の括弧が抜けてる


この投稿にコメントする

削除パスワード

No.22908

Re:構造体の動的確保でセグメントエラー
投稿者---Hermit(2005/08/30 22:22:43)


file_st = (struct filein *)malloc(sizeof(struct filein) *1);

まきじさんも書いてるけど、malloc の後、realloc は、
ちょっと変かも。

いろいろやり方はあると思うけど、
file_st = NULL;
にしておけば、最初の realloc は、malloc と同じ動作になるはずなので
それでもいいのでは?



この投稿にコメントする

削除パスワード

No.22918

Re:構造体の動的確保でセグメントエラー
投稿者---cunt(2005/08/31 18:23:39)


まきじさん、Hermitさん、アドバイスありがとうございます。
おかげさまで、i+1 に括弧をつけることで解決いたしました。
また、mallocは止めて、 file_st = NULL という記述に変更しました。
事前にサンプルを作って動いていたので括弧は無くてもいいと思い込んでいました。
勉強になりました。
ありがとうございました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧