Some good questions
(一)
#include <stdio.h>
#include <stdlib.h>
void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,"hello world");
}
int main( )
{
char *str=NULL;
getmemory(str);
printf("%s/n",str);
free(str);
return 0;
}
程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险。
上面代码传str的值进去带不出来,如果对指针进行赋值一定要用更高一级的指针,否则就要有返回值malloc()分配了新的内存给p,但是原来函数中的p是复制了str的值进行操作,函数执行完之后p就找不到了,str并没有得到p的值,同时把p丢了,也没有办法回收分配给p的内存。
#include <stdio.h>
#include <string.h>
#include <stdlib.h> void getmemory(char **p) //双重指针
{
*p=(char *) malloc(100);
strcpy(*p,"hello world");
}
int main( )
{
char *str=NULL;
getmemory(&str); //传地址
printf("%s\n",str);
free(str);
return 0;
} 或者:
#include <stdio.h>
#include <string.h>
#include <stdlib.h> char* getmemory(char *p) //返回char*
{
p=(char *) malloc(100);
strcpy(p,"hello world");
return p; //返回值
}
int main( )
{
char *str=NULL;
str=getmemory(str);
printf("%s\n",str);
free(str);
return 0;
} (二)
char szstr[10];
strcpy(szstr,"0123456789");
产生什么结果?为什么?
答案:长度不一样,会造成非法的OS
源码实现:
int strlen(const char* str)
{
int i=0;
while(*str++ !=’’) i++;
return i;
}
char* strcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ )
;
return( dst );
}
或者
char *strcpy(char *dest, const char *src)
{
unsigned i;
for (i=0; src[i] != '\0'; ++i)
dest[i] = src[i];
dest[i] = '\0';
return dest;
}
(三)
struct name1{ //字节对齐问题
char str; //sizeof(char)为1
short x; //sizeof(short)为2
int num; //sizeof(int)为4
}; //以4字节对齐,前面2个在第一个4字节里面,所以就是4+4了
struct name2{
char str;
int num;
short x;
}; //同样以4字节对齐,这里的char和short分开了,4+4+4了
为什么sizeof(name1)=8;sizeof(name2)=12
问题补充:
类似的
struct s1{
int i:8; //因为int占了4字节,
int i:4; //和上面的一起在了4个字节
int a:3; //4字节
double b; //sizeof(double)为8,以8字节对齐,前面的2个合一起为8,所以8+8
};//16
struct s2{
int i:8;
int i:4; //2个合一起4字节。
double b; //以8字节对齐
int a:3;
};//24 //8+8+8
(*) int i:8 ;和int i;有区别,int i:8这个是意思是占32位(4字节)中的8位,int i这个要占满4个字节。
Some good questions的更多相关文章
- WCF学习系列二---【WCF Interview Questions – Part 2 翻译系列】
http://www.topwcftutorials.net/2012/09/wcf-faqs-part2.html WCF Interview Questions – Part 2 This WCF ...
- [译]Node.js Interview Questions and Answers (2017 Edition)
原文 Node.js Interview Questions for 2017 什么是error-first callback? 如何避免无止境的callback? 什么是Promises? 用什么工 ...
- [面试] Design Questions
Uber总是考一些系统设计的题目,而且重复率很高,汇总了一下地里的所有design的题目,希望可以跟小伙伴们讨论下. Uber Design Questions 1. 让design uber ...
- Front End Developer Questions 前端开发人员问题(二)CSS 后续
问题来源:http://markyun.github.io/2015/Front-end-Developer-Questions/ 31.视差滚动效果,如何给每页做不同的动画?(回到顶部,向下滑动要再 ...
- WCF学习系列三--【WCF Interview Questions – Part 3 翻译系列】
http://www.topwcftutorials.net/2012/10/wcf-faqs-part3.html WCF Interview Questions – Part 3 This WCF ...
- WCF学习系列四--【WCF Interview Questions – Part 4 翻译系列】
WCF Interview Questions – Part 4 This WCF service tutorial is part-4 in series of WCF Interview Qu ...
- [转]Design Pattern Interview Questions - Part 4
Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...
- [转]Design Pattern Interview Questions - Part 2
Interpeter , Iterator , Mediator , Memento and Observer design patterns. (I) what is Interpreter pat ...
- [转]Design Pattern Interview Questions - Part 3
State, Stratergy, Visitor Adapter and fly weight design pattern from interview perspective. (I) Can ...
- [转]Design Pattern Interview Questions - Part 1
Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...
随机推荐
- oracle查询表信息
oracle查询表信息(索引,外键,列等) oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下: 1.查询出所有的用户表 select * fro ...
- Unicode解码、URL编码/解码
+ (NSString *) stringByReplaceUnicode:(NSString *)string { NSMutableString *convertedString = [strin ...
- 持续更新visual studio 命令、快捷键(原创)
“格式化代码” Ctrl + E + D “注释” Ctrl + E + C “取消注释” Ctrl + E + U “点代替空白” 编辑-高级-显示空白 快捷键 Ctrl + E + S
- 27 Remove Element
Given an array and a value, remove all instances of that value in place and return the new length. T ...
- C语言静态函数静态变量
C语言程序可以看成由一系列外部对象构成,这些外部对象可能是变量或函数.而内部对象是指定义在函数内部的函数参数及变量. 外部变量定义在函数之外,因此可以在许多函数中使用.由于C语言不允许在一个函数中定义 ...
- slice,substr,substring
var s = '0123456789'; //slice 遇负数,则此负数值等同于 s.length + (负数) s.slice(3,6); //"345", 从位置3开始 ...
- C++进程间通信(常用理解例子)-买票
#include "stdafx.h" #include <iostream>using namespace std; #include "windows.h ...
- 【Java 小实验】重写(覆写 Override)返回值类型能不能相同
背景 每次看到重写那里写着: 重写机制是指子类的方法的方法名.参数表.返回值与父类中被重写的方法都相同,而方法体不同. 而重载是: 方法名与父类中的相同,而参数表不同,则属于同名方法的重载. 本来的感 ...
- 2014第11周四Eclipse开发问题记
今天开发中eclipse工具使用上又学到几点: 1.去除代码空行:在Find输入框中输入:^\s*\n然后替换为空即可: 2.eclipse插件的加载:对于单一个jar文件的插件,直接放在plugin ...
- Spring、Struts2+Spring+Hibernate整合步骤
所使用的Jar包: Hibernate: Spring(使用MyEclipse自动导入框架功能) Struts2: 注解包和MySql驱动包: 1.配置Hibernate和Spring: <be ...