2013-03-17 1 views
1

glib 2.0 API를 사용하고 있습니다. CSV 파일을 읽고 g_strsplit 함수를 사용하여 쉼표 사이의 데이터를 가져옵니다. 다음은 내 코드입니다.g_strsplit 에러 (무료() : 다음 크기가 유효하지 않습니다)

gchar* record = get_record_from_file(); 
printf("Record: %s\n", record); <--- WORKS CORRECTLY 
gchar** data = g_strsplit(record, ",", 6); <-- ERROR HERE 
free(record); 

분할 방법을 사용할 때 오류가 발생합니다. 여기에 내 결과가있다.

기록 : 2,0.4,2,0,1,10,

* glibc에 감지 */경로 /로는/내/프로젝트 : 무료() : 다음 크기 (정상) 무효 : 0x0000000001c06a00 ***

나는 인터넷 검색을 시도했다. 분명히 this 질문과 대답에서 오류가 메모리와 관련이 있습니다.

이것은 메모리 오류임을 나타냅니다. 당신은 포인터를 malloc에 ​​의해 할당되지 않은 (또는 이 new에 의해 생성되지 않은 객체를 삭제하는) 포인터를 해제하려고 시도하고 있거나 객체를 두 번 이상 자유롭게 삭제하려고 시도 중일 수 있습니다. 버퍼 오버플로가 있거나 쓰지 않아야하는 메모리에 쓸 수 있으므로 힙이 손상 될 수 있습니다.

g_strsplit가 올바르게 호출 되었습니까? 이 오류가 발생하는 이유는 무엇입니까?

Doc

:

문자열 : 문자열을 분할합니다.

구분 기호 : 문자열을 분할 할 위치를 지정하는 문자열. max_tokens에 도달하지 않으면 분리 문자는 결과 문자열에 포함되지 않습니다.

max_tokens : 문자열을 분할 할 최대 개수입니다. 이 이 1보다 작 으면 문자열이 완전히 분리됩니다.

새롭게 할당 된 NULL로 끝나는 문자열 배열. 그것을 해제하려면 g_strfreev()를 사용하십시오.

답변

1

나는 무엇이 문제인지 알아 냈다. 버퍼의 크기가 너무 커서 데이터를 저장할 수 없기 때문에 오류가 발생했습니다. 나는 그것을 증가 시켰고 오류는 사라졌다.

+0

반가워요. 귀하가 게시 한 코드에는 다른 어떤 것도 명백하지 않았습니다. valgrind와 같은 도구를 사용하면 향후 이와 같은 메모리 문제를 해결할 수 있습니다. – iain

+0

모든 도움에 감사드립니다. 고맙습니다. :) – Goaler444

2

당신은 g_strsplit는 NULL이 delimiter&delimiter에 대한 문자열을 종료 기대하고 있기 때문에 그 이유는 너무

gchar **data = g_strsplit (result, ",", 6); 

같은 g_strsplit를 호출해야 나중에 그래서 씁니다 NULL 문자로 단일 문자의 메모리 주소를 제공합니다 일부 메모리 오버

+0

실수 였고 지적 해 주셔서 고맙습니다. 오류는 여전히 남아 있습니다. = – Goaler444

+0

이제 자유 오류가 발생했습니다. 레코드가 malloc 되었습니까? – suspectus

+0

그런 경우 어떻게'레코드'가 할당 되었습니까? malloc 또는 g_malloc 사용? 아니면 실제로 해제되지 않아야하는 const 문자열입니까? – iain

관련 문제