c语言缓冲区是什么意思_来看一道"简单的"C语言面试题

来源:公众号【编程珠玑】

作者:守望先生

ID:shouwangxiansheng

近期文章

貌似很久没有更新文章了,前两天更新了一篇《想后台运行没想到导致磁盘满了》,里面涉及的内容比较广,可惜看的人不多。今天来看到小题,复习一下。

下面的输出结果是什么?为什么

//来源:公众号编程珠玑//作者:守望先生#include#include#includevoid getmemory(char *p) {
    p=(char *) malloc(128);strcpy(p,"hello 编程珠玑");
}int main( ) {char *str = NULL;
    getmemory(str);printf("%s\n",str);free(str);return 0;
}

结果

先不要看下面的分析,上面的代码中,你发现了哪些问题呢?

这是一道非常常见的面试题,很多人一眼看过去就知道问题在哪了,是的,程序运行异常,可能出现Segmentation fault。

分析

首先第一个问题在于,str的值是没有变的,也就是说执行getmemory之后,str还是NULL,即不能达到预期,使得str指向一个保存着字符串的内存区域。而这里主要考察的是对C语言中参数值传递的理解。更加详细的解释可以参考《函数参数的传值和传指针有什么区别?》。

而真正导致Segmentation fault的原因是printf中,str是NULL,而访问NULL位置的内存是非法的。这一点在《解引用NULL为什么会导致程序挂死?》中也有解释。

另外使用strcpy进行字符串的拷贝也是不推荐的,可能有缓冲区溢出的风险,推荐使用strncpy。关于缓冲区溢出,可以参考《C语言入坑指南-缓冲区溢出》。

修正

//来源:公众号编程珠玑//作者:守望先生#include#include#includevoid getmemory(char **p) {
    *p = (char *) malloc(128);if(NULL == *p){printf("get memory failed\n");return;
    }strncpy(*p,"hello 编程珠玑",sizeof("hello 编程珠玑"));
}int main( ) {char *str = NULL;
    getmemory(&str);if(NULL != str){printf("%s\n",str);
    }free(str);
    str = NULL;return 0;
}

7ff2aeadc430052e556ee565f0920a42.png

相关精彩推荐

f3bf2a17bb12a9fe46d25f5652fbd93b.png 解引用NULL为什么会导致程序挂死? 函数参数的传值和传指针有什么区别? C语言入坑指南-缓冲区溢出 想后台运行没想到导致磁盘满了你可能不知道的printf 关注公众号【编程珠玑】,获取更多Linux/C/C++/数据结构与算法/计算机基础/工具等原创技术文章。后台免费获取经典电子书和视频资源 15a921b213ce105ef72115caac873f66.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值