0
#include <stdio.h>
typedef struct TESTCASE{
    char *before; 
}ts;
int main(void) {
     ts t[2] = {{"abcd"}, 
                {"abcd"}};
     t[0].before[0] = t[0].before[2] = t[0].before[3] = 'b';
     printf("%s - %s\n", t[0].before, t[1].before);
     return 0;
}

出力は

bbbb - bbbb

Cygwinでgccでコンパイルします

cc -g test.c -o テスト

私の質問は、どのコンパイル オプションを使用して、bbbb - abcd の結果を取得できるかということです。

4

2 に答える 2

5

文字列を書き込むことは想定されていません。文字列は「不変」であり、書き込むと未定義の動作が発生します。

そのため、コンパイラは両方の文字列に同じ場所を自由に使用できます。

ヒント: strdup() - C で何をするの?

于 2012-09-20T13:20:39.987 に答える
0

t[0].before[3] = 'b';一部のシステムでは、セグメンテーション違反が発生します。定数文字列に書き込むことはできません。

#include <stdio.h>
typedef struct TESTCASE{
  char before[5];
}ts;
int main(void) {
  ts t[2] = {{ {'a','b','c','d',0} },
             { {'a','b','c','d',0} }};
  t[0].before[0] = t[0].before[2] = t[0].before[3] = 'b';
  printf("%s - %s\n", t[0].before, t[1].before);
  return 0;
}
于 2012-09-20T13:36:27.873 に答える