C语言中malloc为字符型指针分配内存引起的缓冲区泄露
生活随笔
收集整理的這篇文章主要介紹了
C语言中malloc为字符型指针分配内存引起的缓冲区泄露
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*
問題描述;
緩沖區溢出:
(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;}
總結
以上是生活随笔為你收集整理的C语言中malloc为字符型指针分配内存引起的缓冲区泄露的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32F10X的boot分析
- 下一篇: C语言二级指针与典型应用(1)