2017-11-28 40 views
-1

私はこの問題を克服しました。文字列を構造体に変換する関数を実装しました。私はこのような構造を持っている:Cの構造体へのポインタのrealloc()

typedef struct { 
    unsigned a, b; 
    unsigned c, d; 
    } struct_t; 

機能の見出しは以下の通りです:作成した新しい構造へのretval Pポインタ\

struct_t * string_to_struct (char * g) 

。 \ retval変換に失敗した場合はNULLを返します。 "5 8 10 10"(私はsegmentation faultエラーが出ています)のような文字列の変換は成功しませんが、 "5 6 6 7"や "4 5 6 8"などの文字列では成功します。私は問題が構造体pへのポインタのためのメモリの割り当て内にあると思う。 私が最初にこのようにpのメモリを割り当てることについて考え:

p = (struct_t*)malloc(sizeof(struct_t)); 

そして私は(一部の文字列は、約8バイトであり、すべてが正常に動作して文字列のための部屋作りに起因するPのためのメモリを再割り当てについて考えたが、文字列が約10バイトの場合は、segmentation faultが得られます。上記のようにpのメモリを割り当てることで、8バイトの空き領域が確保されます)。realloc()関数を使用して構造体を配置し、私はそれを正しく行う方法を知らない。

struct_t * string_to_struct (char * g){ 

struct_t * p; /* pointer to new structure*/ 
int n; 
n = sizeof(g); 

if(sizeof(g) > sizeof(struct_t)) 
    p = (struct_t*)malloc(n*sizeof(struct_t)); 
else 
    p = (struct_t*)malloc(sizeof(struct_t)); 

if(g[0] == '\0') /* trivial */ 
    return NULL; 
else     
     (*p).a = g[0]; 
     (*p).b = g[2]; 
     (*p).c = g[4]; 
     (*p).d = g[6]; 

      if((*p).a <= (*p).c && (*p).b <= (*p).d) /* check, the elements of the structure must satisfy those relations.*/ 
       return p; 
      else 
       return NULL; /* convertion not successful */ 

}

しかし、それは働いていない: ここでは、私がrealloc()を使用していない、機能を実装しようとした方法です。助けを前にありがとう。

+0

struct_t、no languageタグ(CまたはC++)、コードなし、実際の質問は定義されていません。申し訳ありませんが、これは本当に不明です*とすぐに閉鎖する可能性があります。 –

+0

割り振り(不要なキャストは別)は問題ありません。このエラーは、解析中の可能性が最も高いです。 'string_to_struct'関数の全身を表示します。 – dbush

+0

'sizeof(g)'は 'strlen(g)'と非常に異なります。 –

答えて

0

まず、ロジックのこのビットは不要です。

int n; 
n = sizeof(g); 

if(sizeof(g) > sizeof(struct_t)) 
    p = (struct_t*)malloc(n*sizeof(struct_t)); 
else 
    p = (struct_t*)malloc(sizeof(struct_t)); 

あなたの構造体の1つのインスタンスに割り当てるメモリの正しい量が常にsizeof(struct_t)です。文字列の長さは関係ありません。また、sizeof(g)ポインタのサイズではなく、文字列の長さを指定しています。文字列の長さはstrlen(g)です。

p = malloc(sizeof(struct_t)); 

主な問題はここにある:これは何

(*p).a = g[0]; 
    (*p).b = g[2]; 
    (*p).c = g[4]; 
    (*p).d = g[6]; 

は、ASCII値を格納しているに文字列に特定の文字の(あなたのシステムをと仮定するとASCIIを使用しています)あなたが上記を置き換えることができますあなたの構造体を整数として返します。 "5 6 6 7"と入力した場合、g[0]には'5'という文字が含まれています。これはASCII値が53であるため、p->aの値は53です。入力がすべて1桁の数字である場合、使用するインデックスは文字列内の桁数に対応しているため、各桁のASCII値になります。 '0''9'のASCII値は連続しているため、比較は期待通りに機能します。

"5 8 10 10"のような文字列を使用すると、数字の位置に関する上記の仮定が破られます。したがって、a'5'(53)、b'8'(56)、cは(49)、およびdはスペース(ASCII 32)を取得します。次に、56が32より小さくないため、(*p).b <= (*p).d)の比較が失敗するため、関数はNULLを返します。NULLが返されたかどうかを呼び出し関数がチェックしていないため、おそらくセグメンテーションが発生しています。

文字列を正しく解析するには、文字列をトークンに分割してからatoiまたはstrtolを使用して各部分文字列を整数に変換します。

関連する問題