【发布时间】:2019-09-05 04:26:01
【问题描述】:
我正在使用 GNU ARM 嵌入式工具链处理 STM32 uC。我试图找出在循环内初始化指针时会发生什么。一个非常简单的例子如下(部分是伪代码):
while(1)
{
char* msg = "my message";
transmit_via_uart(msg, strlen(msg));
delay(1000);
}
每次再次初始化指针msg时,处理器是否为堆上的字符串分配新空间?还是会覆盖“旧”指针msg 指向的空间(未分配新空间)?
我知道,我可以将初始化行放在 while 循环上方,我只是好奇会发生什么,无法弄清楚。
感谢您的快速答复! T.
编辑:对不起!当然编译器不会分配任何东西...... :)
【问题讨论】:
-
编译器不在堆上分配任何东西。您的程序在调用
malloc和朋友时会执行此操作。没有malloc调用,所以没有堆分配。我建议买一本关于 C 的好书。 -
真正了解发生了什么的唯一方法是编译代码并查看程序集。您得到的答案仅对特定编译器(包括使用的选项)和使用的特定系统有效。例如,您可以使用godbolt.org 进行检查。也就是说,您不太可能看到任何内存分配。
-
几乎所有现代编译器都会优化对
strlen的调用,即这个函数调用将被编译为transmit_via_uart(address_of_string_literal, 10);,如seen here。编写const char* msg = "my message";也是一个好主意,以确保您的代码不会尝试改变字符串文字。