我正在使用 GNU ARM 嵌入式工具链处理 STM32 uC。我试图找出在循环内初始化指针时会发生什么。一个非常小的例子如下(部分伪代码):
while(1)
{
char* msg = "my message";
transmit_via_uart(msg, strlen(msg));
delay(1000);
}
每次再次初始化指针msg
时,处理器是否为堆上的字符串分配新的空间?或者它是否会覆盖“旧”指针 msg
指向的空间(未分配新空间)?
我知道,我可以将初始化行放在 while 循环之上,我只是好奇会发生什么,无法弄清楚。
感谢您的快速回答!
编辑:抱歉!当然,编译器不会分配任何东西……:)
最佳答案
C 程序永远不会在堆上分配,除非您显式使用 malloc
系列函数。
字符串文字 "my message"
存储在 ROM 中(可能在大多数系统上称为 .rodata
或 .text
的部分) .它在程序启动时分配在那里。
msg
指针仅仅指向 ROM 中的那个地址。指针本身分配在堆栈或 CPU 寄存器中。
然而,编译器足够聪明,可以看到即使您在循环中重复调用它,地址也不会改变。因此,它很可能会优化变量 msg
,并简单地将可以找到字符串的原始硬编码 ROM 地址传递给函数。
您可以将初始化放在循环之上就好了,除非您使用的是石器时代的 30 年前的 C90 编译器。
作为旁注,编写代码的更好方法是:
char msg[] = "my message";
transmit_via_uart(msg, sizeof(msg)-1);
通过这种方式,您可以在编译时计算字符串文字的大小,因为它是常数且已知。通过使用 strlen
,您可以强制进行运行时计算,而编译器可能不够智能,无法进行优化。
关于c - 一次又一次初始化时,指针在循环内做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55684932/