C语言中文字常量是不是会被分配到flash中
在应用于嵌入式的C语言中,对于初始化的全局变量和静态变量而言,其初始化的数值会被编译器写进flash,然后在程序运行之初在内存中划出一段空间,作为全局变量和静态变量空间,...
在应用于嵌入式的C语言中,对于初始化的全局变量和静态变量而言,其初始化的数值会被编译器写进flash,然后在程序运行之初在内存中划出一段空间,作为全局变量和静态变量空间,然后把flash里的内容复制到这段ram空间中(不知道我理解的这个过程对不对)。
那对于文字常量,其过程是不是也类似。
比如定义一个字符串 char a[]={"hello word!"};系统会在运行的过程中遇到这句话才申请内存空间并向内存中写入hello world,还是在编译之初就将hello world写进flash中,然后拷贝到内存中?抑或是如果把a在全局定义就按上述后者描述的来,而如果a是在函数中定义的就按照上述前者描述的来?
不知道我啰里啰嗦的说清楚了没有。。。
在AVR-libc里看到了一段话,或许对解释这个问题有点帮助。
The standard RAM layout is to place .data variables first, from the beginning of the internal RAM, followed by .bss.
The stack is started from the top of internal RAM, growing downwards. The so-called "heap" available for the dynamic
memory allocator will be placed beyond the end of .bss. Thus, there’s no risk that dynamic memory will ever collide with
the RAM variables (unless there were bugs in the implementation of the allocator). 展开
那对于文字常量,其过程是不是也类似。
比如定义一个字符串 char a[]={"hello word!"};系统会在运行的过程中遇到这句话才申请内存空间并向内存中写入hello world,还是在编译之初就将hello world写进flash中,然后拷贝到内存中?抑或是如果把a在全局定义就按上述后者描述的来,而如果a是在函数中定义的就按照上述前者描述的来?
不知道我啰里啰嗦的说清楚了没有。。。
在AVR-libc里看到了一段话,或许对解释这个问题有点帮助。
The standard RAM layout is to place .data variables first, from the beginning of the internal RAM, followed by .bss.
The stack is started from the top of internal RAM, growing downwards. The so-called "heap" available for the dynamic
memory allocator will be placed beyond the end of .bss. Thus, there’s no risk that dynamic memory will ever collide with
the RAM variables (unless there were bugs in the implementation of the allocator). 展开
1个回答
展开全部
char a[]={"hello word!"},不管a是定义全局或局部的,“hello word”肯定是占用flash空间的;区别就是,当a定义成全局变量的时候,程序加载时就会在全局变量和静态变量区域分配空间,赋初值“hello word”;而当a定义成局部变量的时候,只有当调用其所在的函数时,才会从栈里分配内存,并附上初值“hello word”,函数返回时,a占用的栈内存自动释放。
追问
我在一个函数中定义一个很长的字符串常量,并
打印出来(如果不打印编译器会把变量优化掉)
char a[]={"a...."}; printf("%s",a);
然后编译一遍,发现编译的报告中flash和RAM占用的空间都增加了很多。
编译器用的是WinAVR,我不确定编译结果中RAM有没有把局部变量算进来,不过根据报告结果看应该没有。如果没算,那说明即使是定义成局部变量,它仍然会占静态存储区而不是栈区。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询