如何告诉C编译器不要重叠我的字符串

时间:2016-11-04 10:31:35

标签: c arrays string

我正在开发一个在数组中包含字符串的应用程序,如:

static char * strings[] = {
  "ABC DEF",
  "EF",
  "GHI"
};

注意,该类型没有const修饰符!

在我的应用程序中,我循环遍历数组并恢复字符串。预期结果是:

{
  "FED CBA",
  "FE",
  "IHG"
}

然而,我得到的结果是:

{
  "FED CAB",
  "AB",
  "IHG"
}

原因是因为在原始数组中,字符串被编译为重叠:strings [1]重叠字符串[0]的结尾!!!

// When I printed out the pointers it turned out that in the RAM
// it stored my strings "overlapping":
//  00 01 02 03 04 05 06 07 08 09 0a 0b
// "A  B  C  __ D  E  F  \0 G  H  I  \0"

static char * strings[] = {
  0x00, 0x05, 0x08
};

有没有办法(除了没有不起作用的const修饰符)告诉编译器不要重叠我的字符串?这是编译器或我的代码中的错误吗?我可以做什么工作?

1 个答案:

答案 0 :(得分:6)

您正在获取未定义的行为,因为您正在修改一个字符串,该字符串实现为指向字符串文字的char *,这是无效的。

您必须将它们放在显式数组中,以确保它们是可修改的:

static char str1[] = "ABC DEF", str2[] = "EF", str3[] = "GHI";
static char * strings[] = { str1, str2, str3 };

请注意,所有str字符串的类型都为char [],而不是char *,因此它们是正确的数组。当然,非const数组总是可以修改的。

如果您愿意提交最大字符串长度,您可以执行2D数组类型的声明以使其更紧凑:

static char strings[][10] = { "ABC DEF", "EF", "GHI" };

顺便说一下,这个问题几乎是XY problem