字符串

本文深入探讨了C语言中字符串常量和局部变量的区别,特别是涉及数组初始化、const关键字、字符串常量存储位置以及常量与变量在编译时的行为。通过分析不同代码片段的编译结果和输出内容,揭示了C语言中字符串处理的常见陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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能正常输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值