面试题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;
}

参考:栈和堆memset动态申请2维数组

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:

http://songpengfei.iteye.com/blog/1100239

posted @ 2014-07-07 23:08  哈士奇.银桑  阅读(155)  评论(0编辑  收藏  举报