2017-04-20 16 views
0
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

#define MAX_HEIGHT 5 
#define MAX_WIDTH 9 
#define MAX_DIRECT 30 

typedef struct position_t position_t; 

struct position_t { 
     char *position; 
     char *ptr; 
}; 

int main(int argc, char *argv[]) 
{ 
     int i; 
     FILE *fp; 
     char a[50], b[50], c[50], d[50]; 
     position_t pos; 

     pos.position = malloc(sizeof(char) * 20); 

     for (i = 1; i < argc; i++) { 
       fp = fopen(argv[i], "r"); 
       if (fp == NULL) { 
         fprintf(stderr, "cat: can't open %s\n", argv[i]); 
         continue; 
       } 

       fgets(a, 50, fp); 
       fgets(b, 50, fp); 
       fgets(c, 50, fp); 
       fgets(d, 50, fp); 

       fclose(fp); 

       while (1) { 
         int j = 0; 

         pos.position = 0; 
         pos.ptr = strtok(a, ",.; "); 

         while (pos.ptr != NULL) { 
           pos.position[j] = *pos.ptr; 
           j++; 
           pos.ptr = strtok(NULL, ",.; "); 
         } 

         printf("%c", pos.position[j]); 
       } 

     } 

     free(pos.position); 
     return 0; 
} 

ファイルから最初の行(START FOYER ELEVATORの内容)を読み込み、スペースで区切ってstrtokで分割し、それぞれの文字列をmalloc posに格納します。私が使用したい場所のどこにでも使用してください。誰かがこのコードを修正してもらえますか?mallocとstrtokの使い方は?

+1

[mallocの返却についてのこの質問](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)を読むことをお勧めします。 –

答えて

4

pos.position = (char*)malloc(sizeof(char)*20); 

を使用すると、メモリの20バイトを割り当て、そのメモリへpos.positionポイントになります。

しかし、その後、あなたはpos.positionがNULLポインタになります

pos.position = 0; 

を行います。

あなたはmallocによって返されたポインタを失うと、ポインタのこのリセットはメモリリークの両方につながる、それはまた、未定義の動作にときなどでポインタデリファレンスをリードしますpos.position[j]。あなたは、内側whileループの後

printf("%c", pos.position[j]); 

を行い、あなたが初期化されていないメモリの要素を印刷さらに

、。


現在のコードを機能させるには、ループ内のポインタをリセットしないでください。内部whileループの後にターミネータを追加してください。配列を文字列として出力します。ああ、条件を追加して、割り当てられたメモリの境界から書き出さないようにします。

実際には、常に固定量のメモリを割り当てるので、メモリを動的に割り当てないことをお勧めします。代わりにpos.positionの配列にしてください。