2014-11-03 4 views
1

읽기 (stdin에서 파일 가져 오기) 기능을 가지고 처음 세 줄을 읽고이를 연결합니다.C 프로그래밍 - valgrind에서 오류를 일으키는 strcat() 사용

char line[LINESIZE]; 
char *temp_fd = malloc(sizeof(char)*LINESIZE*3); 
char *temp_sm = malloc(sizeof(char)*LINESIZE); 
char *temp_nm = malloc(sizeof(char)*LINESIZE); 

char temp_pc[LINESIZE]; 

for(i=0;i<3;i++) { 
    if (fgets(line, LINESIZE, file) != NULL) { 
     strcat(temp_fd,line); 

     if (i==0) 
      strcpy(temp_sn, line); 
     else if(i==1) 
      strcpy(temp_nm, line); 
     else if(i==2) 
      strcpy(temp_pc,line); 
    } 
} 

valgrind에서 두 개의 오류가 발생하지만 strcat이 문제입니다. 내 포인터에 대한 메모리를 올바르게 할당하는 방법? (LINESIZE는 60btw입니다.)

고마워요!

+1

무엇입니까 'temp_sn'를? 이것이 실제 코드입니까? –

+0

그리고 여러분이 그것에있는 동안,'sizeof (char)'는 정의상 1이므로, 여러분은 그것을 버려 둘 수 있습니다. –

답변

3

사용하기 전에 버퍼 공간을 지우는 데 아무 것도하지 않습니다.

두 가지 방법으로 해결할 수 있습니다. 하나가 작동 것이다 :

  • 그것을 사용하기 전에 버퍼의 머리에 널 종료 바이트를 작성 (예 strcpy(temp_fd, "");)

  • 이다 calloc 대신 temp_fd 이후

2

malloc들로 할당 초기화되지 않은 경우 루프를 처음 수행 할 때 strcat 대신 strcpy을 사용해야합니다. 이렇게하면 문자열을 추가하는 대신 문자열을 복사합니다.

이 이유는 strcat이 콘텐츠를 복사하기 전에 데이터를 추가 할 위치를 검색하기 때문입니다. 그러나 을 호출 할 때 temp_fd의 내용이 초기화되지 않아 문제가 발생합니다.

또는, 바로 할당 후 temp_fd의 초기 위치에 '\0'을 넣어 루프의 모든 반복에 strcat 호출 할 수

char *temp_fd = malloc(sizeof(char)*LINESIZE*3); 
temp_fd[0] = '\0'; 
+0

'LINESIZE * 3'은'temp_fd'가 루프를 통해 매번 내용을 누적한다고 가정합니다. – aschepler

+0

@aschepler 맞습니다. OP는 처음 세 줄을 연결하여 문자열을 만들고 싶습니다. 감사! – dasblinkenlight