1

重複の可能性:
Cのchars[]とchar*sの違いは何ですか?
char * str =“…”とchar str [N] =“…”の違いは?

私は次のように定義された構造を持っています:

typedef struct
{
  bool                  configured;
  bool                  active;
  uint32                lastComms;
  uint32                rxChRvdTime;
  char                  *name;
}vehicle;

そして私はそれを次のように初期化します:

static vehicle *myVehicle; 

名前を初期化するときは、次を使用します。

myVehicle->name = "helloworld";

そして、これはうまくいきます。しかし、文字列リテラル以外に設定したくない場合は、問題が発生するようです。

char *tmpName = "foobar";
strcpy(myVehicle->name, tmpName);

では、なぜstrcpyが機能しないのですか?どういうわけか、事前に構造内の文字列サイズを事前に割り当てる必要がありますか?車両は1台しか存在できないため、「名前」フィールドにポインターを使用するべきではありませんか?

4

3 に答える 3

2

コピーするメモリを割り当てる必要があります。

 myVehicle->name = malloc(strlen(tmpName) + 1);
 if (myVehicle->name)
 {
     strcpy(myVehicle->name, tmpName);
 }

初期化されmyVehicle->nameていないchar*. あなたmalloc()がする必要がある場合free()nameプログラムの存続期間中存在する文字列リテラルのアドレスを指定するため、文字列リテラルへの割り当てが機能します。

myVehicleただし、その前に、それ自体にメモリを割り当てる必要があります。

myVehicle = malloc(sizeof(*myVehicle));

またはmyVehicle、ポインターではなくオブジェクトを作成します。

static vehicle myVehicle;
于 2012-10-20T15:54:39.050 に答える
0

あなたがしたい

  myVehicle->name = strdup("foobar");

free後で忘れないでください。

実際には、通常、strdup定数リテラル文字列は使用しません (ただし、その文字列が後で上書きされる可能性がある場合は、定数リテラル文字列は通常読み取り専用セグメントにとどまり、それらへの書き込みは未定義の動作であるため、そうする必要があります)。いくつかのバッファに文字列を作成し、strdupそのバッファを作成する場合があります。より現実的な例は次のとおりです。

 char buf[32];
 static int counter;
 counter++;
 snprintf(buf, sizeof(buf), "#%d", counter);
 myVehicle->name = strdup(buf);
于 2012-10-20T15:54:44.650 に答える
0

ポインタが指す実際のメモリではなく、ポインタを宣言しただけです。試す:

char *tmpName = "foobar";
myVehicle->name = malloc(strlen(tmpName) + 1);
if (myVehicle->name)
    strcpy(myVehicle->name, tmpName);
else
{
    // error
}

myVehicle->name使い終わったら解放することを忘れないでください。

于 2012-10-20T15:54:45.413 に答える