2011-02-01 3 views
0

C에서 두 개의 문자열을 연결하려고하고 있는데 이유를 모르지만 segfault 오류가 발생합니다. 아래 코드 줄의 첫 줄에 gdb를 사용하여 추적했습니다.C에서 문자열을 연결하려고 시도하는이 코드에 어떤 문제가 있습니까?

strcat(tempString, "uptime"); 
    pFile = fopen (tempString,"r"); 

tempString is = "/ proc /". tempString에 문자열 "uptime"을 추가 한 다음/proc 폴더에 파일이있는 경우 파일을 열려고합니다. memcpy()가 strcat()에 의해 호출 될 때 실제 segfault가 발생합니다.

+2

'tempString'을 올바르게 할당 했습니까? – John

+0

원래는 아니지만, 이제 char tempString [80]으로 바꿨습니다. – ihtkwot

답변

6

당신은이 라인 전에 몇 가지 코드를 표시하지 않은,하지만 (일정 MEM 크기 할당 포함) 일정
제 2 라인 strcat가 atempt 것이다 그것을 만드는

tempString = "/proc/"; 

사용하여 할당 가능성 tempString입니다 버퍼에서 6 바이트를 알 수없는 영역 (* 성공한 경우)으로 채우는 문자열 상수를 덮어 씁니다. 책임

사용 strcat와 : JeremyP가 지적으로는 텍스트 세그먼트를 가리키는 경우 http://beej.us/guide/bgc/output/html/multipage/strcat.html

*,이 읽기 전용이며 당신은 미국을 보였다 경우 물건을 확인 도움이 될

+5

실제로, 선언에 대한 가정이 맞다면 (확실합니다), tempString은 텍스트 세그먼트의 위치를 ​​가리키며 읽기 전용입니다. 그것은 아마 seg 결함의 원인 일 수 있습니다. – JeremyP

+0

그게 내가 한 일이기 때문에 strcpy (tempString, "/ proc /")를 사용하도록 변경했으며 여전히 같은 일을합니다. – ihtkwot

+1

@nmr : 아마도 문자열을위한 공간을 할당하지 않을 것입니다. 'char tempString [128];'과 같은 것을 시도해보십시오 (필요한 크기가 다를 수 있습니다). –

2

세그먼트 폴트를 발생합니다 tempString을 정의하는 행. 그러나, 당신은 char * tempString = "/proc/";과 같은 것을 가지고있는 것처럼 보이고 그것을 수정하려고합니다. 따옴표로 묶인 문자열이기 때문에 수정하거나 수정하지 못할 수도 있으며, 시도 할 경우 세그먼테이션 오류가 발생할 가능성이 큽니다. (또한 "/proc/"은 7이 char이고 마지막에 아무 것도 추가하면 다른 것을 덮어 쓰게됩니다.)

수정 가능한 문자열의 경우 스택이나 힙에 할당 된 자체 버퍼가 있어야합니다. 너는 충분히 길어야한다.

+0

을 추가했습니다. "/ proc /"에서 6자를 셉니다. – RichardTheKiwi

+0

그래서 공간 문제를 처리하기 위해 배열을 명시 적으로 할당 할 수 있습니까? 또는 malloc()을 사용해야합니까? – ihtkwot

+0

@nmr'malloc()'을 사용할 수 있지만 스택 ('char tempString [1024]')에 할당하는 것이 더 쉬워야합니다. – chrisaycock

관련 문제