C内存相关的题目总结

今天突然看到了一些C的内存相关的题目,貌似是曾今的面试题,发现自己确实还真没能完全理解,现在把自己整理好的想法写下来

(注意)经过请教和查资料,下面分析的可能不准确,
             详细分析请看:点击连接






程序一:

void  getMemory( char  *p)
{
                p=(  char  *)malloc(100);
}

int  main()
{
                  char  *str=NULL;
                getMemory(str);
                strcpy(str,  "hello" );
                printf(  "%s" ,str);
                free(str);
                  return  0;
}

结果:崩溃。。。。相当于按值传递。。。。

【注意】程序最后一定要加上free(str),否则会造成内存泄漏。。。

改动:传递指针,

void  getMemory( char **p)
{
                *p=(  char  *)malloc(100);
}

int  main()
{
                  char  *str=NULL;
                getMemory(&str);
                strcpy(str,  "hello" );
                printf(  "%s" ,str);
                free(str);
                  return  0;
}

结果正确...



程序二:

char  * GetMemory()
{
                  char  p[]= "hello"  ;
                  return  p;
}
int  main()
{
                  char  *str = NULL;
                str = GetMemory();
                printf(str);
                  return  0;
}

结果:乱码。。。 char p[] = "helloword",p指向一块内存,该内存中存的是“helloword”,在函数的栈中,函数结束后栈中的内存会被回收,再输出就是乱码。 如果写成char *p = "hello",输出的就不是乱码 。 关于这个题目 ,我觉得 http://t.cn/zTbnSJg 讲的挺好的
我的理解是:首先“hello”这个常量字符串肯定会存在静态数据区,用char *p,返回的是存在静态区的该串的指针,不会因为p被回收而消失(静态的哦),而用char p[],会有一份字符串存在静态,另一份存在栈中,返回的是存在栈中的指针,会被回收。
为了便于理解:如下

char str1[] = "abc";
char str2[] = "abc";//返回的存在栈中,所以str1和str2的不想等


char *str3 = "abc";
char *str4 = "abc";//静态区公用


cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;

结果是:0  1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值