2015-12-24 62 views
4

我正在寫一個UNIX的paste克隆。但是我不斷收到「遇到斷點」的消息,但VS不會告訴我它發生了什麼事。「test.exe遇到斷點」

#include <stdio.h> 
#include <stdlib.h> 

#define INITALLOC 16 
#define STEP   8 

int main(int argc, char *argv[]) 
{ 
    if (horzmerge(argc - 1, argv + 1) == 0) { 
     perror("horzmerge"); 
     return EXIT_FAILURE; 
    } 
    getchar(); 
    return EXIT_SUCCESS; 
} 
int horzmerge(int nfiles, const char **filenames) 
{ 
    FILE **files; 
    char *line; 
    int i; 

    if ((files = malloc(nfiles * sizeof (FILE *))) == NULL) 
     return 0; 

    for (i = 0; i < nfiles; ++i) 
     if ((files[i] = fopen(filenames[i], "r")) == NULL) 
      return 0; 

    do { 
     for (i = 0; i < nfiles; ++i) { 
      if (getline(files[i], &line) == 0) 
       return 0; 
      fprintf(stdout, "%s", line); 
      free(line); 
     } 
     putchar('\n'); 
    } while (!feof(files[0])); /* we can still get another line */ 

    for (i = 0; i < nfiles; ++i) 
     fclose(files[i]); 
    free(files); 
    return 1; 
} 
int getline(FILE *fp, char **dynline) 
{ 
    size_t nalloced = INITALLOC; 
    int c, i; 

    if ((*dynline = calloc(INITALLOC, sizeof(char))) == NULL) 
     return 0; 

    for (i = 0; (c = getc(fp)) != EOF && c != '\n'; ++i) { 
     if (i == nalloced) 
      if ((*dynline = realloc(*dynline, nalloced += STEP)) == NULL) 
       return 0; 
     (*dynline)[i] = c; 
    } 
    (*dynline)[i] = '\0'; 
    if (c == EOF) 
     return EOF; 
    return i; 
} 

我把斷點,並認爲這是horzmergefree(line)聲明。但有時程序運行良好。有時它不會。有時我在getline中收到「堆已損壞」。我一直在研究這個代碼一個星期,但仍然找不到錯誤。

+0

嘗試使用類似[valgrind](http://valgrind.org/docs/manual/quick-start.html)的內容? –

+0

沒有函數原型?那麼'while(!feof(files [0]))' –

+0

@WeatherVane使用'feof'調用,我可以判斷是否需要閱讀更多行。 – user3144238

回答

1

它看起來像我的行空你終止輸入字符串是能夠超越你緩衝區calloc編輯或realloc編輯。當你使用free緩衝區時,這有可能破壞你的堆。

當您分配內存時,不要忘記爲字符串末尾的空字符留出空間。

以空字符結尾的字符串就像迪斯科舞廳。他們仍然吸了四十年後。

相關問題