2

構造体に文字列を持たせたい。私はそれを次のように定義しました:

typedef struct myStruct {
  char* stringy
} myStruct

と関数

free(char *stringy){
   //structObj is a struct object
   structObj->stringy = stringy
}

これは正しいです?ローカル変数なのでstringyが無くなり、ポインタがガベージを指すような気がします。

申し訳ありませんが、C の新機能です。

4

5 に答える 5

1

コードにローカル変数宣言がありません。

次のことを宣言する必要があります。

typedef struct myStruct {
  char* stringy
} myStruct;

free(char *stringy){
   myStruct *structObj;
   structObj->stringy = stringy;
}

typedef 宣言の最後に追加したセミコロンに注意してください。
これはあなたのコードにはありませんでした。

オブジェクト structObj は、型が myStruct の構造体です。

これで、パラメーター stringy は別のサイトから取得されましたが、失われていません。
ただし、構造体 structObj は、「無料」関数内でのみ期間を持ちます。

編集

エラーを修正しました: 正しい宣言は「structObj へのポインター」でなければなりません。これは次のように行われます。

  myStruct *structObj;

myStruct が初期化されていないポインターになっていることに注意してください。したがって、次の代入は有効です。

  structObj->stringy = stringy;

しかし、うまくいきません。

ただし、これは元の質問の範囲を超えていると思います...

于 2013-09-04T04:02:41.303 に答える
1

stringy関数の呼び出し元で定義されている場合、実際の文字列をその場所 (ポイント先)freeに保持している限り、問題はありません。stringy

于 2013-09-04T03:54:26.387 に答える
0

myStructstruct myStructあなたが使用する前にオブジェクトを作成する必要があるあなたのために定義したタイプです。

次のようにする必要があります。

typedef struct myStruct {
  char *stringy;  
} myStruct_t; //user defined  data type  

 myStruct_t *obj;  

// you need to allocate memory dynamically.   
 obj= (myStruct_t *) malloc(sizeof(myStruct_t)); 

利用方法:

scanf("%s",obj->stringy);

printf("%s",obj->stringy);

関数内:

  my_free(char *str)  //str is local string 
    {
     obj->stringy=str;
    }

このコードを試すこともできます:

typedef struct myStruct {
  char stringy[20]; //char *stringy  
} myStruct_t; //user defined  data type

myStruct_t obj; //object creation    

利用方法:

scanf("%s",obj.stringy);

printf("%s",obj.stringy);

関数内:

   my_free(char *str)  //str is local string 
    {
       strcpy(obj.stringy,str);
    }
于 2013-09-04T04:01:49.553 に答える
-1

それが指しているものが範囲外になるとすぐに、ガベージを指すことは間違いありません: this is a dangling pointer . これを修正するには、メモリを割り当ててコピーを実行する必要があります。

add_string(my_struct* s, const char* c)
{
    size_t len = strlen(c);
    s->file = malloc(len + 1);
    strcpy(s->file, c);
}

free完了したら必要になることを忘れないでください。

void destroy_struct(my_struct* s)
{
    free(s->file);
    free(s);
}
于 2013-09-04T03:59:18.567 に答える