왜 세그멘테이션 오류가 날까요?
글쓴이: 익명 사용자 / 작성시간: 토, 2017/10/28 - 8:52오후
typedef struct
{
int mode;
void* value;
}TP;
typedef struct
{
int i;
int j;
}TV;
uint8_t T_alloc(unsigned long v_size, TP* p, void* v)
{
p = malloc(sizeof(TP));
v = malloc(v_size);
p->value = v;
}
void T_free(TP* p)
{
free(p->value);
free(p);
}
void main()
{
TP* p;
TV* v;
T_alloc(sizeof(TV), p, (void*) v);
T_free(v);
}
이게 전체의 소스입니다.
free(p->value);에서 오류가 나는데 이유를 모르겠네요.
어디서부터 잘못된걸까요?
Forums:

많이 잘못되었습니다..
하나하나 확인해보세요.
일단...
void main() { TP* p; TV* v; T_alloc(sizeof(TV), p, (void*) v); T_free(v); }이 코드만 봐도 p와 v에는 어떠한 값도 들어가지 못합니다.
p와 v에 값을 저장하려는 목적인거 같은데
초기 p와 v에는 알 수 없는 값(초기화되지 않은 변수)이 들어가게 되고
그 "값"만이 T_alloc으로 전달 될 뿐입니다.
그 후에
uint8_t T_alloc(unsigned long v_size, TP* p, void* v)
함수를 실행하고 이 안에서 p와 v을 바꾼다 한들 T_alloc함수 안에서만 p와 v값이 바뀌고
main에서의 p와 v는 변하지 않습니다.
포인터의 개념부터 잡으셔야 할거 같습니다.
// T_alloc는 아래와 같이 uint8_t T_alloc(unsigned long v_size, TP** p, void** v) { // 여러가지 작업 // *p = 0x1234; 이렇게 하면 main의 p에 0x1234가 들어갑니다. } // 메인문은 아래와 같이 void main() { TP* p; TV* v; T_alloc(sizeof(TV), &p, (void**)&v); // 변수앞에 붙는 &연산자는 해당 변수의 포인터(주소)를 가져오는 연산자입니다. T_free(v); }참고해보세요.
http://codepad.org/qf5KHERW
#include <stdio.h> typedef struct { int mode; void* value; }TP; typedef struct { int i; int j; }TV; void T_free(TP* p); uint8_t T_alloc(unsigned long v_size, TP* p, void* v) { printf("sizeof(TP) %d\n", sizeof(TP)); //8 printf("v_size %ld\n", v_size); //8 p = (TP*) malloc(sizeof(TP)); v = (void*) malloc(v_size); printf("p %d\n", (int)p); //8 p->value = v; T_free(p); return v_size; } void T_free(TP* p) { if(p != NULL) { if(p->value != NULL) { free(p->value); p->value = NULL; } free(p); p = NULL; } } TP* T_alloc2(unsigned long v_size, TP *p, void* v) { printf("sizeof(TP) %d\n", sizeof(TP)); //8 printf("v_size %ld\n", v_size); //8 p = (TP*) malloc(sizeof(TP)); v = (void*) malloc(v_size); printf("p %d\n", (int)p); //8 p->value = v; return p; } int main() { TP* p = NULL; TV* v = NULL; T_alloc(sizeof(TV), p, (void*) v); printf("main p %d\n", (int)p); //8 p = T_alloc2(sizeof(TV), p, (void*) v); printf("main p %d\n", (int)p); //8 T_free(p); return 0; }----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기