全局字符串

假如要声明一个全局的字符串
CHAR8 *CustCmdLine = " xxx";
CHAR8 CustCmdLine[] = " xxx";
两种声明方式有什么区别

  1. 指针声明:char *CustCmdLine = " xxx";
    custstr 是一个指针变量,存储的是字符串字面量 " xxx" 的地址。
    字符串字面量本身不可修改。
+---------------------+
|       Stack         |  ← 局部变量、函数调用等(可读可写)
+---------------------+
|          ↓          |
|                     |
|          ↑          |
+---------------------+
|       Heap          |  ← 动态分配的内存(可读可写)
+---------------------+
|   .data / .bss      |  ← 全局变量、静态变量(可读可写)
+---------------------+
|       .rodata       |  ← 只读数据(如字符串字面量)
+---------------------+
|       .text         |  ← 程序代码(只读)
+---------------------+

" xxx" 会存放在 .rodata 段中。

指针变量 p 本身(存储地址值的变量)可能位于栈或全局数据区,具体取决于它的作用域:

如果 p 是全局变量 → 存储在 .data 段。

如果 p 是局部变量 → 存储在栈中。

  1. 数组声明:char CustCmdLine[] = " xxx";

CustCmdLine 是一个可修改的字符数组,存储的是字符串 " xxx" 的副本。

数组内存位于可写区域(如全局数据区或栈),允许修改内容。

就可以认为如果是CHAR8 *CustCmdLine = " xxx";这种方式,指针本身是放在.data里面的,而指针指向的实际字符串是放在ROdata 里面的,所以不能修改它的内容。

一个例子

CHAR8 *CustomCmdLine = " androidboot.custom=1";这样定义的一个然后后面我对它拼接,报错如下

DXE_ASSERT!: [LinuxLoader] ^Library/BaseLib/SafeString.c (2014): (CopyLen > SourceLen)
�

修改成数组的形式就可以了或者自己管理