2009-12-12 2 views
0

프로그램을 올바르게 수정하고 실행할 수는 있었지만 실제로 작동하지 않는 이유는 저를 매우 흥미롭게 만들었습니다.malloc()으로 할당 된 메모리를 채우는 효과

malloc을 사용하여 문자열을 만들고 초기화했습니다. 그 다음에 여러 개의 strcat를 사용했습니다 ... 그리고 나서 파일 포인터를 선언합니다. 그 후 내 문자열이 약 이상일 경우. 26 chars 나머지는 쓰레기가 될 것입니다 ...하지만 내가 malloc 문자열에 이전에 포인터를 선언했다면 훌륭하게 작동했습니다.

코드 :

char* holder=(char*)malloc(sizeof(char)*100); 

for(i=0;i<100;i++) 
    *(holder+i)='\0'; 

strcat(holder,"set xtics ("); 

//will ignore until the last n lines 
for(i=0;i<26-n;i++) 
    readline(sfd,line,29); 

//will manage the last lines 
char n_column[2]; 
char freq[3]={0}; 

for(i;i<26;i++) 
{ 
    readline(sfd,line,29); 
    sscanf(line+4,"%s",freq); 
    write(out,freq,strlen(freq)); 
    write(out,"\n",1); 
    strcat(holder,"'"); 
    sscanf(line,"%s",temp); 
    strcat(holder,temp);   
    strcat(holder,"'"); 
    sprintf(n_column,"%d",counter); 
    strcat(holder," "); 
    strcat(holder,n_column); 
    //for the las one which won't have the , 
    if(i==25) 
     strcat(holder,")"); 
    else 
     strcat(holder,", "); 
    counter++;  

} 

//sending to gnuplot using pipe 
printf("Before: %s\n",holder); 
FILE *pipe = popen("gnuplot -persist","w"); //why can't it be here!!!! 
printf("After: %s\n",holder); 

출력 :

전 : 세트 xtics를 사람이 더 pls는 그렇게 말을 참조하는 것이 좋습니다 생각하면 난 그냥 여기 코드의 일부이다, 이유를 이해할 수 없다 ('a'0, b 1, c 2, d 3, e 4, f 5, g 6, j 7, k 8, l 9 , 'm'10, 'n'11, 'o'12, 'p'13, 'q'14 'r'15 'u'16 'v'17 ''w '18' 'x'19 , 'y'20, 'z'21 ''h '22' 'i'23 ''t '24's '25)

이후 xtics ('a '0,'b '1, 'c'2, 'd'3, 'e'4, 'f'5, 'g'6, 'j'7, 'k' 8 '패'9 'm'10 '없음'11 'O'

하지만 변경하는 경우 :

FILE * 파이프 =는 popen ("의 gnuplot -persist", "w");

char* holder=(char*)malloc(sizeof(char)*100); 
for(i=0;i<100;i++) 
    *(holder+i)='\0'; 

출력이 정상입니다.

왜 파일 포인터를 선언하면 그렇게 큰 차이가 있습니까? 아니면 그 외에 뭔가가 있습니까?

양해 해 주셔서 감사합니다.

+0

왜 C를 사용하고 있습니까? 당신은 메모리 관리를 이해하지 못하는 동안 그것을 사용하여 많은 해를 끼치는 것처럼 보입니다. 작은 문자열에서 문자열을 만드는 것과 같은 간단한 일을 망칠 수없는 Python이나 Java와 같은 언어를 사용해보십시오. :) –

+0

원래 제목이 질문의 주제와 관련하여 단서를 제공하지 않았기 때문에 제목을 편집했습니다. – pavium

+0

가장 좋아하는 답변을 수락하는 것을 잊지 마십시오. 또는 다른 사람들이 선호하는 대답을 받아들입니다. 들어갈 좋은 습관이 될 것입니다. – pavium

답변

2

n_column []을 2보다 크게 만들 수 있습니다. 배열의 끝을 덮어 쓰고 있습니다.

sprintf(n_column,"%d",counter); 

유일한 문제인지 확실하지 않습니다.

+0

보테가 옳았다 ... 물건을 "단단히"만들려고 노력한 것에 의한 나의 잘못 :) ... 많은 thx –

4

100 바이트 버퍼와 208 바이트 문자열이 있습니다. 그 100 바이트 바깥의 메모리는 당신 소유가 아닙니다.

3

버퍼를 100 자로 할당하고 있습니다.

100 자 이상을 복사하려고합니다.

당신이 부패하고 있다는 사실에 놀랄 필요가 없습니다.

관련 문제