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;
}
我把斷點,並認爲這是horzmerge
的free(line)
聲明。但有時程序運行良好。有時它不會。有時我在getline
中收到「堆已損壞」。我一直在研究這個代碼一個星期,但仍然找不到錯誤。
嘗試使用類似[valgrind](http://valgrind.org/docs/manual/quick-start.html)的內容? –
沒有函數原型?那麼'while(!feof(files [0]))' –
@WeatherVane使用'feof'調用,我可以判斷是否需要閱讀更多行。 – user3144238