프로그래밍

 3198, 1/160 회원가입  로그인  
   rocket07
   http://--
   C언어 간단한거 질문좀 할게요~

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3297 [복사]


#include <stdio.h>
#include "ed.h"
#include <stdlib.h>

int main()
{
        char *b;
        int a;
        scanf("%d", &a);

        b = (char *) malloc(sizeof(char) * a +1);

        scanf("%s", b);

        printf("%s\n %d\n", b, sizeof(b));
        
        free(b);

        ed(1);
}

요기서 ed는 그냥 임의로 만든 함수니 무시하셔요ㅎ

이 프로그램을 실행시키고 a에다가 3 입력하면 b의 크기는 4바이트가 되어야 하잖아요

그럼 3을 입력하고 aaaaaaaa 이정도로 입력하면 버퍼오버플로우가 일어나야하는게 정상아닌가요?

근데 실제로 해보면 프로그램 잘 작동하고 심지어 b의 크기를 알아볼려고 적어둔 코드에선 a에 어떤수를

입력하든 상관없이 4로만 나옵니다  왜이런거죠?


  Hit : 3158     Date : 2012/01/31 11:48



    
effortkim sizeof(b)를 했을 때 4바이트가 나온 이유는, b가 포인터로 선언되었기 때문입니다. 이는 당연한것이, b가 가리키는 메모리 공간이 a값에 따라 달라지는것이지 변수 b의 크기가 달라지는것은 아니기 때문입니다. 32bit OS에서는 메모리에 부여되는 주소값이 4바이트입니다. 2012/02/01  
effortkim 그리고 혹시나 확인해 보았는데, 윈도우 환경에서 오버플로우가 일어납니다. 리눅스도 (당연히) 일어날 것입니다. 2012/02/01  
rocket07 아하! effort님 답변 감사합니다!

근데 또 궁금점이 하나있는데요, b 이거 말고 *b로 해서 메모리확보할려구하면 오류가 나는데

오 ㅐ그런가요? char 에서 * char 로 변경할수 없다네요;
2012/02/02