2013年5月14号笔试


参加的笔试和面试越多,越发现自己水出翔。。。要特别特别努力了~~!!

1.一个长度为n的无重复序列入栈的所有出栈方式

           题目是:1 2 3   三个元素分别入 栈和出栈,出栈方式有多少种, 可以使用公式直接算出来。5种(还好考试记得公式~~)

           1。有个公式是                  

           2.  用程序来实现一下 所有的打印输出。

           以后在写


2.看下面的代码有什么错误,有错误的话指出并修改。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int string_cpy(char *p)
{
    p = malloc(100);

    strcpy(p,"hello world");
    return 1;
}

int main(void)
{

    char *str2 ;
    string_cpy(str2);
    printf("%s\n",str2);
    return 0;
}
修改之后:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int string_cpy(char **p)
{
    *p = (char *)malloc(100*sizeof(char));

    strcpy(*p,"hello world");
    return 1;
}

int main(void)
{

    char *str2 = (char *)malloc(sizeof(char ));
    string_cpy(&str2);
    printf("%s\n",str2);
    return 0;
}
因为你str2 传进去的指针,到了函数里面修改了地址,所以要传进去指针的指针。

3.写出一段栈溢出和堆溢出的代码:


       栈溢出:

栈溢出就是 缓冲区溢出的一种。 由于 缓冲区溢出使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间, 通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。缓冲区​长度一般与用户自己定义的缓冲变量的类型有关。
栈溢出就是缓冲区溢出的一种。 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。向这些单元写入任意的数据,一般只会导致程序崩溃之类的事故,对这种情况我们也至多说这个程序有 bug 但如果向这些单元写入的是精心准备好的数据,就可能使得程序流程被劫持,致使不希望的代码被执行,落入攻击者的掌控之中,这就不仅仅是bug,而是 漏洞 (exploit)了。

       堆溢出:

堆溢出又叫做静态缓冲区(注意,不是静态存储区)溢出,堆是成员在函数内部 自己分配的内存空间。如果向分配的空间写入超过空间本身大小的数据的时候,就会出现堆溢出。
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main ()
{
  char *buffer1, * buffer2;
  char str[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
  buffer1= (char*)malloc (32);
  buffer2= (char*)malloc (16);
/*向buffer1中复制,多复制6字节*/
  memcpy (buffer1, str, 32+6);
  free (buffer1);
  free (buffer2);
  return 0;
}

这个时候运行会出现段错误。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值