3

次のコードは常にセグメンテーション違反になります。

  char *test3 = (char *) malloc(sizeof(char) * 5);
  test3 = "asdf";
  printf("%s\n", test3);

次のコードはセグメンテーション フォールトしません。

  char *test3 = (char *) malloc(sizeof(char) * 5);
  test3[0] = 'a';
  test3[1] = 'b';
  test3[2] = 'c';
  test3[3] = 'd';
  test3[4] = '\0';
  printf("%s\n", test3);

問題は、動的に作成された cstring に cstring リテラルをどのように割り当てるのですか?

4

4 に答える 4

2

文字列を「埋める」正しい方法は次のとおりです。

 strcpy(test3, "abcd"); 

ただし、使用しないことを強くお勧めしますmalloc[そして絶対に使用しないでください(char *) malloc(...)-これは、バグがそうする傾向があるため、少なくとも適切な瞬間に飛び跳ねてあなたを噛むかなり厄介なバグを隠すことができるためです-あなたおそらく、C コードを C++ コードとしてコンパイルしているからでしょう。これは間違っており、このような悪い習慣を教えてくれます]。

を使用mallocして小さな文字列を割り当てると、スペースが大幅に浪費されます。5 文字の文字列にはおそらく 16 ~ 32 バイトのオーバーヘッドがあり、8 または 16 バイトに丸められます。したがって、5 バイトを格納するために、合計で 48 バイトを使用する可能性があります。これは、スペースの大きな無駄です。

于 2013-08-07T23:44:15.300 に答える
0

この場合、「=」を使用して文字列値を割り当てることはできません。

strcpy または sprintf 関数を使用する必要があります。プログラムの終了時 (または文字列が使用されなくなったとき) に解放することを忘れないでください! 例えば ​​:

#define BUFSIZE 5

int main(void) {
    char *test3 = malloc(sizeof(char) * BUFSIZE);
    snprintf(test3,BUFSIZE,"test");
    printf("%s\n", test3);
    free(test3);
    return 0;
}

または、次のように書くこともできます:

int main(void) {
    char buf[BUFSIZE] = "test";
    printf("%s\n", buf);
    return 0;
}
于 2013-08-07T23:56:20.087 に答える