gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:21:34 25 4
gpt4 key购买 nike

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

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

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

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

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

但是我得到的结果是:

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

这是因为在原始数组中,字符串被编译为重叠:strings[1] 与 strings[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 修饰符之外)告诉编译器不要重叠我的字符串?这是编译器中的错误还是我的代码中的错误?我可以采取什么解决方法?

最佳答案

由于您正在修改作为指向字符串文字的 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 .

关于c - 如何告诉 C 编译器不要重叠我的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40420419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com