[c언어] 왜 세그먼테이션 폴트가 날까요? 멀록과 프리 관한것입니다.

bus710의 이미지

실 구문은 아래 같습니다.

#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 외에는 힙을 갖다 쓴것이 없는데 종료 전에 폴트가 뜨는군요.
어떤 부분에 문제 소지 있는지 아시는분....??

sephiron의 이미지

InputData 힙 안 잡아주셨네요.

bus710의 이미지

댓글 감사드립니다.

그러나 다소 이해가 안되는 것은...

InputData 는 스택에서 잡히는 것이 아니었나요??;;
scanf 에서 입력된 문자열의 주소 값을 가지는것 아닌가요?

좀 더 코드를 잘라내 봐야겠군요...

life is only one time

BeEye의 이미지

InputData 자체는 스택에 잡힙니다만...
입력된 문자열이 저장될 힙 영역이 잡혀있질않아서 문제가 생기는 거죠.

InputData이 잡혀있는 스택은 InputData라는 포인터 변수가 주소값을 저장하는 영역이죠.
입력될 데이터(문자열)을 저장하는 영역은 아니죠.
그 곳을 malloc() 등을 이용해서 힙 영역에 잡아주셔야 문제가 해결되겠죠.

+------------------------------------+
|항상 행복하고 싶은 평범한 지구인.|
+------------------------------------+

+------------------------------------+
|항상 행복하고 싶은 평범한 지구인.|
+------------------------------------+

나빌레라의 이미지

char InputData[1024] = {0};

이렇게 바꿔놓고 사용하시면, scanf 를 통해 입력받은 문자열데이터가 들어갈 공간이 스택에 생기게 되므로,

세스폴트 익셉션이 발생하지 않을 겁니다.

akudoku 님의 원래 코드 처럼 저렇게 해 놓으면, InputData 가 가르키고 있는 주소부터 scanf 로 받은 문자열이 쭉 입력이 되긴 하는데,

그 메모리 영역은 미리 할당 받은 공간이 아니므로, 이후에 벌어질 메모리 참조 연산에서 세그폴트 익셉션 발생 가능성이 높아지게 되는 겁니다.

얇은 사 하이얀 고깔은 고이 접어서 나빌레라

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

bus710의 이미지

감사합니다^^
이제야 확실히 이해가 됐습니다.

life is only one time

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.