昨天面试遇到的一道C语言题
楼主之前是做C/C++开发的,今年转到java,hadoop方向了,所以很多C/C++的细节都有些模糊了,碰巧这次面试题中,就出了一道C指针的问题。
问题不算难,但楼主一时之间竟也想不起来答案了。。。
这道题给出了一小段程序,要你写出结果,程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> void func(char *p)
{
p = (char *) malloc ();
} int main(void)
{
char *p = NULL; func(p); strncpy(p, "hello", strlen("hello")); printf("p = %s\n", p);
}
这道题主要考察了“指针变量”的概念,char *p中,p就是指针变量,其中存放了所指向变量的地址。
当p作为实参传入func函数时,形参中的char *p中的p也时一个局部变量,也就是说,在func函数中,p变量的变化,并不会引起main函数中p的改变。
所以即便在func函数中,给p申请了空间,但main函数中的p仍旧是NULL指针,所以本题的答案应该是:
段错误
如果需要程序正常运转,需要将程序修改成:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> void func(char **p)
{
*p = (char *) malloc ();
} int main(void)
{
char *p = NULL; func(&p); strncpy(p, "hello", strlen("hello")); printf("p = %s\n", p);
}
即在main函数调用func函数时,传入p的地址,从而完成在func函数中修改main中的p值。
当然,在实际开发过程中,应该尽量避免这种内存申请的方式,因为申请和销毁如果分开执行,很容易会忘记执行销毁程序,从而造成内存泄漏。
昨天面试遇到的一道C语言题的更多相关文章
- 做了一道cf水题
被一道cf水题卡了半天的时间,主要原因时自己不熟悉c++stl库的函数,本来一个可以用库解决的问题,我用c语言模拟了那个函数半天,结果还超时了. 题意大概就是,给定n个数,查询k次,每次查询过后,输出 ...
- 记一次面试过程中的Python编程题
这几天面试过程中遇到一道Python编程题,题目如下: 面试中遇到一个Python编程问题:一个字符串,将里面的数字取出来,如果第一个数字前面是+,表示整个数字为正数,如果第一个数字前面是-,表示数字 ...
- 一道c语言运算符优先级问题
一道c语言运算符优先级问题 #include <iostream> using namespace std; int main() { char test[] = {"This ...
- 一道C语言安全编码题目
1.前言 最近在网上看到一道C语言题目,用C语言实现一个函数,给定一个int类型的整数,函数输出逆序的整数,例如输入123,则输出字符串"321",,输入-123,则输出字符串&q ...
- 洛谷P3926 SAC E#1 - 一道不可做题 Jelly【模拟/细节】
P3926 SAC E#1 - 一道不可做题 Jelly [链接]:https://www.luogu.org/problem/show?pid=3926 题目背景 SOL君(炉石主播)和SOL菌(完 ...
- l洛谷 P3926 SAC E#1 - 一道不可做题 Jelly
P3926 SAC E#1 - 一道不可做题 Jelly 题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢吃蒟蒻果冻.而SOL菌也很喜欢蒟蒻果冻. 有一 ...
- 利用简易爬虫完成一道基础CTF题
利用简易爬虫完成一道基础CTF题 声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我.如 ...
- 面试一个百度T7程序员,一道简单的题没答上来!网友却都在吐槽面试官!
程序员面试时都考些什么? 一个面试官得意洋洋地说自己面了一个百度T7,出了一道coding题,结果对方连最长上升子序列都写不出来. 楼主本想嘲弄一下百度T7的代码水平低,没想到网友们炸开了锅,纷纷 ...
- 关于定义顺序和内存分配的关系--记一道不严谨的C语言题
include<stdio.h> #include<iostream> int main() { char a[] = "123"; char b[] = ...
随机推荐
- ok6410 u-boot-2012.04.01移植二修改源码支持单板
继ok6410 u-boot-2012.04.01移植一后修改代码,对ok6410单板初始化,主要包括时钟.串口.NAND.DDR等初始化.这些工作在以前的裸板程序都写了,直接拿来用.我觉得先写裸板程 ...
- 汇编条件判断整理(JCC,CMP/TEST的实现)
比较的实现 我们知道CMP是比较两个寄存器内容的指令,但这是如何实现的? 当执行到CMP指令的时候会读取这两个寄存器的内容,并加以减法运算,结果本身不保留,并按照结果设置符号位(属算术运算). CMP ...
- 初识ionic
1.Ionic环境安装 Ionic开发是依赖于Nodejs环境的,所以在开发之前我们需要安装好Nodejs.下载安装:http://nodejs.org/ 安装完成之后打开PowerShell输入命令 ...
- C#开发学习——web服务器端控件
Asp.net在客户端开发和web开发所用到的控件还是有很大的差别的,而且Web开发的界面是在浏览器中显示的,所以控件的设计都和前边学习HTML设计有联系,没有客户端开发那么简单,不过我们可以 ...
- Mysql连表查询
http://blog.csdn.net/qmhball/article/details/8000003 可以参考这篇文章
- 【C#】Send data between applications
This sample shows how to send data between different applications, including object data——transform ...
- 学习笔记之html5相关内容
写一下昨天学习的html5的相关内容,首先谈下初次接触html5的感受.以前总是听说html5是如何的强大,如何的将要改变世界.总是充满了神秘感.首先来谈一下我接触的第一个属性是 input的里面的 ...
- 启动web项目,报内存不足错误的解决方法
Initialization of bean failed; nested exception is java.lang.OutOfMemoryError: Java heap space 原因: 在 ...
- memcahced缓存特点
1.key-value数据结构 2.所有数据保存在内存中 3.可以分布式集群 4.处理并发的机制是libevent事件机制 5.当内容容量达到指定值后,就基于LRU(Least Recently Us ...
- 敏捷开发(六)- SCRUM全员会议
本文主要是为了检测你对SCRUM 全员会议的了解和使用程度,通过本文你可以检测一下 1.你们的SCRUM 全员会议的过程和步骤 2.SCRUM 全员会议的输出结果 一.会议目的 组成团 ...