Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C &引用;test.exe遇到断点“0”;_C_Visual Studio 2015 - Fatal编程技术网

C &引用;test.exe遇到断点“0”;

C &引用;test.exe遇到断点“0”;,c,visual-studio-2015,C,Visual Studio 2015,我正在编写一个UNIX粘贴克隆。然而,我不断收到“遇到断点”消息,但VS不会告诉我发生在哪一行 #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("horzme

我正在编写一个UNIX
粘贴
克隆。然而,我不断收到“遇到断点”消息,但VS不会告诉我发生在哪一行

#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;
}
#包括
#包括
#定义INITALLOC 16
#定义步骤8
int main(int argc,char*argv[])
{
如果(霍兹麦格(argc-1,argv+1)==0){
佩罗(horzmerge);
返回退出失败;
}
getchar();
返回退出成功;
}
int horzmerge(int文件、常量字符**文件名)
{
档案**档案;
字符*行;
int i;
if((files=malloc(nfiles*sizeof(FILE*)))==NULL)
返回0;
对于(i=0;i

我放置了断点,看到它是
horzmerge
中的
free(line)
语句。但有时程序运行良好。有时候不是。有时我在
getline
中得到一个“堆损坏”。我已经在这段代码上工作了一个星期,仍然找不到bug。

在我看来,输入字符串的null终止行可能会溢出缓冲区,你
calloc
ed或
realloc
ed。当你
释放该缓冲区时,这可能会损坏你的堆

分配内存时,不要忘记为字符串末尾的空字符留出空间


以Null结尾的字符串类似于disco。四十年后,它们仍然很烂

尝试使用类似于?无功能原型?当(!feof(files[0])
@WeatherVane使用
feof
调用时,我可以判断是否需要阅读更多行。您是否阅读了
feof()
的手册页?无论如何,这只是数组中的第一个文件。