全局字符串
假如要声明一个全局的字符串
CHAR8 *CustCmdLine = " xxx";
CHAR8 CustCmdLine[] = " xxx";
两种声明方式有什么区别
- 指针声明:char *CustCmdLine = " xxx";
custstr 是一个指针变量,存储的是字符串字面量 " xxx" 的地址。
字符串字面量本身不可修改。
+---------------------+
| Stack | ← 局部变量、函数调用等(可读可写)
+---------------------+
| ↓ |
| |
| ↑ |
+---------------------+
| Heap | ← 动态分配的内存(可读可写)
+---------------------+
| .data / .bss | ← 全局变量、静态变量(可读可写)
+---------------------+
| .rodata | ← 只读数据(如字符串字面量)
+---------------------+
| .text | ← 程序代码(只读)
+---------------------+
" xxx" 会存放在 .rodata 段中。
指针变量 p 本身(存储地址值的变量)可能位于栈或全局数据区,具体取决于它的作用域:
如果 p 是全局变量 → 存储在 .data 段。
如果 p 是局部变量 → 存储在栈中。
- 数组声明: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)
�
修改成数组的形式就可以了或者自己管理