面试题2
一些关于C语言和数据相关的面试题。
1.内存对齐是什么?
为了方便操作系统快速访问内存的一种策略。在结构体中(struct),变量存储的首地址是k(4、8)的倍数。可以使用#pragma pack(n)设置。
参考:博客园内存对齐
2.栈和堆的区别(内存)?实现一个2维数组,初始化。
栈是由系统自动分配空间,自动回收的,存储局部变量。堆是由人为的进行分配,人为释放,可分配的空间较大,内存不连续(链表链接),用来动态申请内存的。
void *memset(void *s,int c,size_t n)
总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
注意memset初始化,因为memset是以字节为单位就是对array指向的内存的4个字节进行赋值,每个都用ASCⅡ为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是
00000001000000010000000100000001
就等于16843009,就完成了对一个INT元素的赋值了。所以用memset对非字符型数组赋初值是不可取的!
#include<stdio.h> #include<stdlib.h> #define R 3 #define C 4 int **dynamic2array(int row,int column) { int **p; p=(int **)malloc(sizeof(int *)*row); int i=0; for(;i<row;i++) { p[i]=(int *)malloc(sizeof(int)*column); memset(p[i],1,column*sizeof(int)); } return p; } int main() { int **p=dynamic2array(R,C); int i=0,j; for(;i<R;i++) { for(j=0;j<C;j++) printf("%d\t",p[i][j]); int *s=p[i]; free(s); s=NULL; } free(p); p=NULL; return 0; }
3.strcpy和strncpy的缺陷?
会出现内存越界、'\0'丢失等情况。
extern char * strcpy(char *dest,const char *src);复制src起始到'\0'结束的字符串到dest中,返回dest。当dest长度小于src长度时,错误。
char *strncpy(char *dest,const char *src,size_t num);复制src起始到num个字符到dest中,返回dest。最好紧接着执行dest[strlen(dest)-1]='\0';
4.c++中调用C函数加extern: