参加的笔试和面试越多,越发现自己水出翔。。。要特别特别努力了~~!!
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;
}
这个时候运行会出现段错误。