2014-11-03 41 views
1

我有一個函數,讀取文件(來自stdin),讀取前3行並連接它們。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是60 btw)

謝謝!

+1

什麼是'temp_sn'?這真的是你的實際代碼? – 2014-11-03 20:26:54

+0

當你在它的時候,'sizeof(char)'的定義是1,所以你可以不要這樣做。 – 2014-11-03 20:40:58

回答

3

在使用它之前,你沒有做任何事情來清理你的緩衝區空間。

有兩種不同的方法可以修復它。無論是將工作:

  • 使用它之前寫空終止字節的緩衝區頭(例如strcpy(temp_fd, "");

  • 分配與calloc代替malloc

2

由於temp_fd是未初始化的,您應該在第一次通過循環時使用strcpy而不是strcat。這會複製字符串,而不是試圖追加它。

原因是strcat在複製內容之前搜索追加數據的位置。但是,在撥打strcat時,temp_fd的內容未初始化,導致該問題。

或者,你可以把'\0'temp_fd初始位置的分配之後,並調用循環的所有迭代strcat

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

'LINESIZE * 3'建議'temp_fd'應該每次循環累積內容。 – aschepler 2014-11-03 20:28:39

+0

@aschepler你是對的,它確實看起來像OP想要通過連接前三行來構建一個字符串。謝謝! – dasblinkenlight 2014-11-03 20:32:54