[c언어] 왜 세그먼테이션 폴트가 날까요? 멀록과 프리 관한것입니다.
실 구문은 아래 같습니다.
#include
#include
struct expression{
struct expression* prev;
struct expression* next;
char* str;
};
int main (void)
{
char* InputData;
int i;
struct expression* head;
head = (struct expression*)malloc(sizeof(struct expression));
head->prev = NULL;
head->next = NULL;
head->str = NULL;
free(head);
printf("%x\n", &InputData);
scanf("%s", InputData);
printf("%s\n", InputData);
for(i=0; ; i++){
if( InputData[i] == '\0' ) break;
printf("%c", InputData[i]);
if( (InputData[i] >= '0') && (InputData[i] <= '9') ){
printf(": number\n");
}
else printf(": character\n");
}
return 0;
}
head 외에는 힙을 갖다 쓴것이 없는데 종료 전에 폴트가 뜨는군요.
어떤 부분에 문제 소지 있는지 아시는분....??
InputData 힙 안
InputData 힙 안 잡아주셨네요.
.
댓글 감사드립니다.
그러나 다소 이해가 안되는 것은...
InputData 는 스택에서 잡히는 것이 아니었나요??;;
scanf 에서 입력된 문자열의 주소 값을 가지는것 아닌가요?
좀 더 코드를 잘라내 봐야겠군요...
life is only one time
InputData 자체는 스택에 잡힙니다만...
InputData 자체는 스택에 잡힙니다만...
입력된 문자열이 저장될 힙 영역이 잡혀있질않아서 문제가 생기는 거죠.
InputData이 잡혀있는 스택은 InputData라는 포인터 변수가 주소값을 저장하는 영역이죠.
입력될 데이터(문자열)을 저장하는 영역은 아니죠.
그 곳을 malloc() 등을 이용해서 힙 영역에 잡아주셔야 문제가 해결되겠죠.
+------------------------------------+
|항상 행복하고 싶은 평범한 지구인.|
+------------------------------------+
+------------------------------------+
|항상 행복하고 싶은 평범한 지구인.|
+------------------------------------+
아니면 배열을 사용하셔도 될겁니다.
char InputData[1024] = {0};
이렇게 바꿔놓고 사용하시면, scanf 를 통해 입력받은 문자열데이터가 들어갈 공간이 스택에 생기게 되므로,
세스폴트 익셉션이 발생하지 않을 겁니다.
akudoku 님의 원래 코드 처럼 저렇게 해 놓으면, InputData 가 가르키고 있는 주소부터 scanf 로 받은 문자열이 쭉 입력이 되긴 하는데,
그 메모리 영역은 미리 할당 받은 공간이 아니므로, 이후에 벌어질 메모리 참조 연산에서 세그폴트 익셉션 발생 가능성이 높아지게 되는 겁니다.
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
감사합니다^^ 이제야
감사합니다^^
이제야 확실히 이해가 됐습니다.
life is only one time
댓글 달기