2014-01-16 2 views
2

저는 Linux를 사용하고 C에서 원격으로 심각한 것을 만드는 데 매우 익숙합니다. 단순히 단일 문자열을 압축하는 프로그램을 만들려고했지만이 분할 컴파일 된 파일을 실행할 때 오류가 발생했습니다. 내가 사용하여 컴파일 :분할 오류 (코어 덤프 됨) 및 zlib

gcc 2.c -o test.o -lz 

내 코드 :이 오류가 발생하는 이유

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <zlib.h> 
#include <assert.h> 
int main() 
{ 
char *istream = malloc(10), *ostream = malloc(120); 
istream = "istream"; 
int res = compress(ostream, (uLongf *)strlen(ostream), istream,(ulong)strlen(istream)); 
return 0; 
} 

누군가가 나에게 설명 할 수 어떻게 내 코드를 향상시킬 수 있습니까?

+0

왜'C++ '태그가 있습니까? –

답변

2

이 줄은 주요 문제가 나타납니다 : 당신은

(uLongf*)strlen(ostream) 

버퍼에 대한 포인터로 size_t 값을 해석합니다. 출력 버퍼의 길이를 포함하는 unsigned long의 주소를 전달하기위한 것입니다. compress에 대한 설명서를 다시 살펴보십시오.

아직 C 문자열의 작동 방식을 아직 이해하지 못했습니다. 할당 연산자가 char* lvalue와 함께 사용되면 단순히 문자열의 내용이 아닌 주소가 복사됩니다. 나는 당신이 C 컴파일러를 사용하고 있다고 가정하고 코드를 작성

int main(void) 
{ 
    const char *istream = "istream"; 
    char ostream[120]; 
    uLongf destLen = sizeof(ostream); 
    int res = compress((Bytef*)ostream, &destLen, (Bytef*)istream, strlen(istream)); 
    return 0; 
} 

참고 :

const char *istream = "istream"; 
char ostream[120]; 

내가 당신의 프로그램이 이러한 라인을 따라 뭔가해야한다고 생각 : 나는 당신이이처럼 버퍼를 선언하는 것이 좋습니다. 그리고 따라서 int main(void).

+0

이 매개 변수는 함수가 반환 될 때 압축 후 실제 출력 크기가 될 것이므로 "출력"매개 변수입니다. –

+1

@JoachimPileborg 입력과 출력 모두입니다. 내 대답을 바로 잡았어. –

1

변경 :

istream = "istream" 

또한

strcpy(istream,"istream"); 

하려면 strlen(ostream) 반환 무엇을 기대 했는가? 120?

strlen은 입력 문자열에서 발생한 첫 0 문자의 색인을 반환합니다.

귀하의 경우 ostream이 가리키는 메모리의 내용을 알 수 없습니다 (예 : "쓰레기").

strlen은 0 문자가 발생할 때까지이 메모리를 검사하지만 120 바이트의 메모리 공간을 초과하고 메모리 액세스 위반이 발생할 수 있습니다.

strlen(ostream)을 120으로 변경하십시오. 당신은

+0

이 문제와 sprintf (istream, "istream") 모두 시도해도 여전히 세그먼트 화 오류가 발생합니다. – FalconD

+0

메모리 할당도 필요합니다. –

+0

'compress '를 호출하면 segfault 예외가 발생한다고 가정하면이 함수를 질문의 일부로 게시하지 않으시겠습니까? –

2

먼저 당신이 메모리에 istream 지점을 할당 :

istream = "istream"; 
:

char *istream = malloc(10) 

다음 당신이 그것을 문자 그대로 가리 (따라서 일정 및 읽기 전용) 문자열을 만들

할당 된 메모리에 문자열 리터럴을 복사해야합니다. 그렇지 않으면 더 이상 원래 포인터가 할당되지 않습니다. 테드와 메모리 누수가 있습니다. 은 malloc으로 할당하지 않은 항목을 가리키고 있기 때문에 free 포인터에 연결할 수 없습니다.

충돌에 대해서는 David Heffernan의 답변을 참조하십시오. 사이드 참고로


, 당신의 코드에는 C++, 순수한 및 일반 C.가 없습니다