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 回答