/*
问题描述;
缓冲区溢出:
(1)malloc:分配一块连续的未被使用得当内存块,但是不能保证内存块临近的其他内存块也未被使用;
(2)当用malloc未char类型指针分配一个字节长度内存时,但向其中保存n个字符组成的字符串,会导致缓冲区溢出
#include <stdio.h>
#include <stdlib.h>
{
char *p = NULL;
char *q = NULL;
p = (char *)malloc(1*sizeof(char));
printf("value(p)= %d\n",p);
printf("value(p+1)= %d\n",p+1);
printf("*(p+1)= %c\n",*(p+1)); //可以打印出$,虽然并不知道是否被系统使用,但是p+1指向的内存中确实有数据;
gets(p);
printf("value(p)= %d\n",p); //验证:p的值仍是malloc返回的地址值,因此gets操作应该是:将数据流依次存进p指 定内存中,并未对字符串单独分配其他内存;
printf("value(p+1)= %d\n",p+1); //验证:即使p执行一个字符串,但是进行p+1运算时,地址仍然只是增加了1个字 节!
printf("value(p+2)= %d\n",p+2);
printf("value(p+3)= %d\n",p+3);
printf("value(p+4)= %d\n",p+4);
printf("value(p+5)= %d\n",p+5);
printf("*(p)= %c\n",*p);
printf("*(p+1)= %c\n",*(p+1));
printf("*(p+2)= %c\n",*(p+2));
printf("*(p+3)= %c\n",*(p+3));
printf("*(p+4)= %c\n",*(p+4));
printf("*(p+5)= %c\n",*(p+5));
printf("*(p+6)= %c\n",*(p+6));
printf("*p= %s\n",p);
q = (char *)malloc(10*sizeof(char));
printf("value(q)= %d\n",q);
printf("value(q+1)= %d\n",q+1);
printf("*(q)= %c\n",*q);
printf("*(q+1)= %c\n",*(q+1));
printf("*(q+2)= %c\n",*(q+2));
printf("*(q+3)= %c\n",*(q+3));
printf("*(q+4)= %c\n",*(q+4));
printf("*(q+5)= %c\n",*(q+5));
printf("*(q+6)= %c\n",*(q+6));
q = "hello"; //验证:q的值被更改,与malloc返回的地址值不同!!因为:"hello"是字符串常量,系统编译 时会为其分配内存空间,q重新指向字符串常量
printf("value(q)= %d\n",q);
free(p);
free(q);
p =q =NULL;
}
问题描述;
缓冲区溢出:
(1)malloc:分配一块连续的未被使用得当内存块,但是不能保证内存块临近的其他内存块也未被使用;
(2)当用malloc未char类型指针分配一个字节长度内存时,但向其中保存n个字符组成的字符串,会导致缓冲区溢出
(3)因此,最好如q一般,在初始化的时候分配足够大的内存,以防止缓冲区泄露;
(4)malloc必须要和free配套使用,否则会导致内存泄露;
(5)指针在使用完后,必须重新指向NULL;否则会变成野指针,
*/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char *p = NULL;
char *q = NULL;
p = (char *)malloc(1*sizeof(char));
printf("value(p)= %d\n",p);
printf("value(p+1)= %d\n",p+1);
printf("*(p+1)= %c\n",*(p+1)); //可以打印出$,虽然并不知道是否被系统使用,但是p+1指向的内存中确实有数据;
gets(p);
printf("value(p)= %d\n",p); //验证:p的值仍是malloc返回的地址值,因此gets操作应该是:将数据流依次存进p指 定内存中,并未对字符串单独分配其他内存;
printf("value(p+1)= %d\n",p+1); //验证:即使p执行一个字符串,但是进行p+1运算时,地址仍然只是增加了1个字 节!
printf("value(p+2)= %d\n",p+2);
printf("value(p+3)= %d\n",p+3);
printf("value(p+4)= %d\n",p+4);
printf("value(p+5)= %d\n",p+5);
printf("*(p)= %c\n",*p);
printf("*(p+1)= %c\n",*(p+1));
printf("*(p+2)= %c\n",*(p+2));
printf("*(p+3)= %c\n",*(p+3));
printf("*(p+4)= %c\n",*(p+4));
printf("*(p+5)= %c\n",*(p+5));
printf("*(p+6)= %c\n",*(p+6));
printf("*p= %s\n",p);
q = (char *)malloc(10*sizeof(char));
printf("value(q)= %d\n",q);
printf("value(q+1)= %d\n",q+1);
printf("*(q)= %c\n",*q);
printf("*(q+1)= %c\n",*(q+1));
printf("*(q+2)= %c\n",*(q+2));
printf("*(q+3)= %c\n",*(q+3));
printf("*(q+4)= %c\n",*(q+4));
printf("*(q+5)= %c\n",*(q+5));
printf("*(q+6)= %c\n",*(q+6));
q = "hello"; //验证:q的值被更改,与malloc返回的地址值不同!!因为:"hello"是字符串常量,系统编译 时会为其分配内存空间,q重新指向字符串常量
printf("value(q)= %d\n",q);
free(p);
free(q);
p =q =NULL;
printf("Hello world!\n");
return 0;}