0

持っている

typedef struct person {
    char name[20]
    char surname[20]
} person_t;

XXXXXX:YYYYYYのような関数 を使用して文字列を作成する必要がありますchar* personToString(person_t *p)。私はそれを作ろうとしました:

char* personToString(person_t* p) {

  int n1,n2;
  n1=strlen(p->name);
  n2=strlen(p->surname);
  char *p = (char*) malloc((n1+n2+2)*sizeof(char));
  strcat(p,puser->name);
  strcat(p,":");
  strcat(p,puser->surname);

  return p;
}

これにより妥当な出力が得られますが、valgrind でテスト中にエラーが発生しました! また、関数をもっと上品に書く方法があると思います!

4

4 に答える 4

3

メモリのメモリをmallocするとp、ガベージ値が保持されます。Strcat はヌル文字の後に文字列を追加しますが、初期化されていない文字列にはランダムな値が保持されます。

最初の strcat を strcpy に置き換えます。

于 2013-07-18T08:19:26.410 に答える
3

必要がある

strcpy(p,puser->name);

いいえ

strcat(p,puser->name);

mallocバッファをゼロに初期化しないため、strcat は最初に p でヌル バイトを検索しますが、おそらく見つからないため、バッファの末尾を超えて読み取り、クラッシュします。

1 つの strcpy と 2 つの strcat の代わりに、sprintf への 1 つの呼び出しを記述することもできます。

sprintf(p, "%s:%s", puser->name, puser->surname);
于 2013-07-18T08:20:02.523 に答える
2

最初に文字列のコピーを呼び出し、次に strcat を呼び出す必要があります。

strcat(p,puser->name);

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

strcpy(p,puser->name);

malloc 関数で割り当てられたメモリは値をガベージに保持するため、最初に strcat を実行すると、ガベージの後に連結されます。また、コードに未定義の動作が発生します。

void* calloc (size_t num, size_t size);malloc() の代わりに calloc 関数を使用して、割り当てられたメモリを初期化します0(その後、strcat() は問題ありません)。void free (void* ptr);)また、動的に割り当てられたメモリは、明示的に使用してメモリ ブロックの割り当てを解除する必要があります。

于 2013-07-18T08:19:03.740 に答える