1 字符串被放在了哪里
void main()
{
const char a[4] = "d";
char b[4] = "ddd";
char c[] = "ddd";
char *d = "ddd";
const char *e ="dddd";
a[0] = 'a';
b[0] = 'a';
c[0] = 'a';
d[0] = 'a';
e[0] = 'a';
}
其中1、5编译通不过。2、3等效,编译器将“ddd”放入其数组,数组b[],c[]均在静态数据区。对于4直接hardfault,因为因为字符串常量事实上就是常量,在IDE编译器只能将它放在flash,直接写flash当然fault。
还有一点,以前一直以为加了const的变量就会被编译器放到ROM中,对于const char a[4] = “d”;这种数组,因为是局部变量编译器是把之放入RAM中的。而如果定义为全局变量,则是放在ROM区的。
2 下面左右两部分代码的输出内容一样吗?如果不一样,请给出理由。
char *getm() {
char p[]="Hello World";
return p;
}
int main() {
char *str=NULL;
str=getm();
printf(str);
} char *getm() {
char *p="Hello World";
return p;
}
int main() {
char *str=NULL;
str=getm();
printf(str);
}
答:不一样。
对于情况1:
char p[]定义为一个局部数组且初始化为“Hello world”,数组p[]是在栈中,返回的p数组首地址也是指向栈区,当函数返回时,栈也被释放,p所指向的地址很可能别其他函数占用,导致输出结果不是“Hello world”.
对于情况2:
char *p为指针,编译器将“Hello world”编译进成量字符串在只读代码段,指向该字符串的指针赋给p。对于情况2能正常输出。