关闭

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

357人阅读 评论(0) 收藏 举报
分类:

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

问题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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4942次
    • 积分:108
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类