一道经常出现的字符串内存地址问题的笔试题

今年秋季的校园招聘已经接近尾声,笔试面试也参加了不少。发现有一道题经常出现,特拿来分享。

问题1:

void getmemory(char *p)
{
    p = (char *)mallol(100);
}
void test(void)
{
    char *str = NULL;
    getmemory(str);
    strcpy(str,”hello,world”);
    printf(str);
}

请问运行Test函数会有什么样的结果?

问题2:

 char*getmemory(void)
{
    char p[] = ”helloworld”;
    return p;
}

void test(void)
{
    char *str = NULL;
    str=Getmemory();
    printf(str);
} 
请问运行Test函数会有什么样的结果?

答案很简单,1 运行过程中会出现错误 2会输出 乱码


如果还有疑惑,gcc编译及运行结果将消除你的疑虑。

第一段代码在Ubunu下的运行结果:

看吧!明显的内存错误!

再看第2段代码:

gcc的编译警告大概已经很能说明问题了!


想必C语言高手会觉得这些问题很low level,可是不幸的是想我这样C语言不扎实的人经常会犯这样的错误!

C语言中,实参变量和形参变量之间的数据传递是单向的“值传递”方式,指针变量作函数参数也要遵循这一原则。调用函数不能改变实参指针变量的值(即指针的地址),但可以改变实参指针变量所指变量的值。

程序1就试图改变 str的值,肯定不成功,getmemory执行完后,str还是NULL,所以在执行strcpy时,程序试图给NULL的指针赋值,会发生运行时错误。

2的问题在于getmemory函数试图返回局部变量的地址。众所周知,局部变量的生命只存在于该函数体内,一旦离开该函数体,该局部变量便在内存中消失,所以str 得到的只能是乱码。


因此,说到底,还是要牢记千万不能返回局部变量的地址,还有小心有指针情况的“传值”!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值