C语言中malloc为字符型指针分配内存引起的缓冲区泄露

/*
问题描述;
缓冲区溢出:
(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;
}


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值