【问题标题】:C is ignoring byte assignment? [duplicate]C忽略字节分配? [复制]
【发布时间】:2016-07-27 11:36:59
【问题描述】:

我做错了什么。

这是来自 ARM 代码(Keil5 IDE)的一段代码:

uint8_t * at_ss_data = (uint8_t *)("\n\rAT$SS=AA AA\n\r");
at_ss_data[12] = 0;

但代码推送到ARM嵌入式板时,变量中的第12个索引(最后一个A)没有变化。

我的目标是将at_ss_data 数组中的AA AA 子字符串更改为00 00

【问题讨论】:

  • 修改字符串文字是未定义的行为。
  • @Notlikethat:在 C 中,字符串字面量 not 类型为 char const *。你在考虑 c++。
  • 或者另一个:Modifying C string constants?(这是最后一个,我停下来搜索其他相同的问题)
  • @Olaf:没有什么“技术上”的。字符串文字没有类型char const[]。如果他们确实,编译器可以捕捉到这种问题,但他们没有。这个很重要。教人们理解 C 的类型系统,否则他们将永远感到困惑。

标签: c arm embedded keil


【解决方案1】:

您不得修改字符串文字(即undefined behavior)。你应该使用一个用字符串字面量初始化的数组。

这样,你的代码应该是:

uint8_t at_ss_data[] = "\n\rAT$SS=AA AA\n\r";
at_ss_data[12] = 0;

【讨论】:

    【解决方案2】:

    at_ss_data 指向只读内存,您不能像这样更改字符串文字。此行为未定义。 相反,您可以尝试这样的事情:

    uint8_t at_ss_data[] = "\n\rAT$SS=AA AA\n\r";
    

    这个数组现在是可写的。

    【讨论】:

    • 你在堆栈上分配内存....这取决于数组的范围。
    • FWIW,这是未定义的行为,可能是因为字符串文字经常驻留在只读内存中,所以你应该这样对待它们。但它们并不总是驻留在只读内存中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 2012-09-13
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多