【问题标题】:Cannot modify char array无法修改字符数组
【发布时间】:2013-01-02 00:03:58
【问题描述】:

考虑下面的代码。

char message[]="foo";

void main(void){
    message[] = "bar";
}

为什么 MPLAB IDE v8.63 中存在语法错误?我只是想改变字符数组的值。

【问题讨论】:

  • 语法错误是编译错误,不是运行时错误,所以这与修改你的char数组无关。你不能写message[] = "bar";,括号之间没有任何内容。它适用于char message[] = "foo";,因为您声明char message[] 然后它分配为message = "foo";
  • 感谢您的帮助。我想知道为字符数组分配新值的正确方法。谢谢。
  • 正如我所说的message = "foo"; 是正确的
  • 在继续处理字符串之前,了解数组和指针的工作原理非常重要。
  • 和一般的内存管理

标签: c arrays memory-management compiler-errors mplab


【解决方案1】:
char message[]="foo";

这个语句导致编译器创建4个字符变量的内存空间。这个内存簇的起始地址是指针值messagemessage 的地址是不可更改的,你不能更改它指向的地址。在这种情况下,您唯一的机会是更改message 指向的数据。

char* message="foo"

此时会创建内存来存储指针的地址,所以message指向的地址在执行过程中可以改变。然后你就可以放心地做message="bar"

【讨论】:

    【解决方案2】:

    你不能像这样改变字符数组。如果你想改变字符数组的值,那么你必须通过修改单个字符来改变它,或者你可以使用

    strcpy(message,"bar");
    

    【讨论】:

    • 我尝试使用此方法,但微控制器 LCD 显示屏中没有显示消息值。它以前适用于“foo”。
    • @newbie 你没有向我们展示你所有的代码,这就是你没有得到帮助的原因。
    【解决方案3】:

    类似的作业

    message[] = "bar";
    

    message = "bar";
    

    C 不支持。

    初始赋值起作用的原因是它实际上是伪装成赋值的数组初始化。编译器解释

    char message[]="foo";
    

    作为

    char message[4] = {'f', 'o', 'o', '\0'};
    

    这里实际上不涉及字符串文字"foo"

    但是当你尝试时

    message = "bar";
    

    “bar”被解释为实际的字符串文字,不仅如此,message 也不是可修改的左值,即。你不能给它分配东西。如果你想修改你的数组,你必须逐个字符地进行:

    message[0] = 'b';
    message[1] = 'a';
    

    等等,或者(更好)使用一个库函数来为你做这件事,比如 strcpy()。

    【讨论】:

    • 微控制器 IDE 的一个奇怪之处是当我尝试 strcpy(message, newmessage) - newmessage 包含“bar”。它工作正常。但是,如果我考虑 strcpy(message, "bar"),它会严重失败。
    • 如果您的微控制器具有哈佛架构,那么您将需要调用特定函数(甚至使用汇编)。在哈佛架构上,有 2 个独立的地址空间(RAM 和 ROM)。 litteral 通常被编译/链接/映射到 ROM 地址。变量位于 RAM 区域。将数据从 ROM 复制到 RAM 需要特殊指令,普通 strcpy 不会使用。
    • char 赋值方法适用于哈佛架构,因为 chars ('b', 'a') 在指令中直接编译为立即值。
    • 我检查了,MPLAB 是用于 Microchip 的,因此 PIC 控制器告诉它是哈佛架构,具有独立的指令和数据存储器。您不能将strcpy 用于垃圾。
    • "foo" 在这里实际上是一个字符串文字。语言的初始化规则之一是 char 数组可以从字符串字面量初始化。
    【解决方案4】:

    声明后不能使用这样的字符数组。如果要为字符数组分配新值,可以这样做:-

    strcpy(message, "bar");
    

    【讨论】:

    • 以前,“foo”出现在我的微控制器 LCD 显示屏中(我有一个 LCD 显示屏将继续显示“char message[]”的值)。我确实包含了 string.h。但是,当我使用上面的方法时,什么都没有显示。
    • 见我上面的评论。您的 µC 很可能是哈佛架构。这里是使用该范例的 µC 列表(非详尽):AVR、PIC、8051、Cortex-M3 等。
    • 我检查了,MPLAB 是用于 Microchip 的,因此 PIC 控制器告诉它是哈佛架构,具有独立的指令和数据存储器。您不能将strcpy 用于垃圾。
    • 我想这说明了一切。谢谢!
    【解决方案5】:

    您只能在声明 char 数组时的初始化中这样做

    message[] = "bar";
    

    你不能在你的代码中这样做

    要修改它,您可以使用 strcpy from <string.h>

    strcpy(message, "bar");
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2019-05-27
      • 2020-06-02
      • 2020-01-04
      • 2022-10-23
      • 2013-10-24
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      相关资源
      最近更新 更多