C 仅当未通过gdb运行时程序崩溃

C 仅当未通过gdb运行时程序崩溃,c,gdb,C,Gdb,我早些时候问了一个关于这个程序的问题,并且能够解决它——好消息是我的程序现在正在运行!坏消息是,只有当我通过gdb运行它时,它才起作用。每当我正常编译程序时,它都会崩溃,但通过gdb运行它会给出正确的输出并允许它正常退出 我读了Dennis Yurichev关于调试gdb中的堆栈或其他问题的帖子,但我对编程还是相当陌生,所以我不知道我在做什么 以下是将gdb附加到程序的进程ID,然后转储堆栈的输出: Breakpoint 1, 0x74337480 in OutputDebugStringA (

我早些时候问了一个关于这个程序的问题,并且能够解决它——好消息是我的程序现在正在运行!坏消息是,只有当我通过gdb运行它时,它才起作用。每当我正常编译程序时,它都会崩溃,但通过gdb运行它会给出正确的输出并允许它正常退出

我读了Dennis Yurichev关于调试gdb中的堆栈或其他问题的帖子,但我对编程还是相当陌生,所以我不知道我在做什么

以下是将gdb附加到程序的进程ID,然后转储堆栈的输出:

Breakpoint 1, 0x74337480 in OutputDebugStringA () from C:\WINDOWS\SysWOW64\KernelBase.dll
(gdb) bt
#0  0x74337480 in OutputDebugStringA () from C:\WINDOWS\SysWOW64\KernelBase.dll
#1  0x77478a64 in msvcrt!_invalid_parameter () from C:\WINDOWS\SysWOW64\msvcrt.dll
#2  0x77425a20 in wctype () from C:\WINDOWS\SysWOW64\msvcrt.dll
#3  0x00010001 in ?? ()
#4  0x77493a09 in msvcrt!fscanf_s () from C:\WINDOWS\SysWOW64\msvcrt.dll
#5  0x7749399b in msvcrt!fscanf () from C:\WINDOWS\SysWOW64\msvcrt.dll
#6  0x00401d0d in main () at ZigSort.c:377
我认为它是说由于无效输入或来自fscanf的东西导致崩溃,但这没有意义…
引用的行(main()行377)是此处的第一个fscanf:

int main(void)
{
    //initializing file pointer
    FILE * ifp;
    ifp = fopen("zigzag.txt", "r");
    int n;

    //getting number of values
    fscanf(ifp, "%d", &n); //**LINE 377 RIGHT HERE**

    //reading values into a queue
    queue_t * data = queue_create();
    int ipt;

    for(int i=0; i<n; i++)
    {
        fscanf(ifp, "%d", &ipt);
        queue_enqueue(data, ipt);
    }

    //creating a stack of queues
    run_stack_t * runstack = run_stack_create();
    queue_t * run = queue_create();

    //finding runs and pushing them onto the stack
    int runs = 0;
    int *runpoint = &runs;
    while(queue_is_empty(data) != 1)
    {
        run = extract_next_run(data);
        run_stack_push(runstack, run);
        *runpoint += 1;
        optimizestack(runstack, runpoint);
    }

    //merging queues together in sorted order
    data = run_stack_pop(runstack);
    queue_t * merger;
    runs -= 1;

    for(int i=0; i<runs; i++)
    {
        merger = run_stack_pop(runstack);
        data = merge(merger, data);
    }
    queue_destroy(merger);

    //output
    printqueue(data);

    //freeing memory
    queue_destroy(data);
    //run_stack_destroy(runstack, runpoint);
    free(runstack);
    free(runpoint);
    fclose(ifp);
}
我很乐意尝试任何可能需要的东西或包括任何其他信息,我只是不知道如何解决这个问题。

提前谢谢

fopen
可能会失败。你应该小心。工作目录可能不一样。试着通过valgrind之类的工具运行它?这将识别出你在内存中做傻事的地方,你的代码缺少错误处理。当然你会得到UB结果。这是一个学校作业,我知道文本文件名为zigzag.txt,它将在同一个工作目录中。如果zigzag.txt在同一工作目录中,我不知道为什么fopen会失败。我在windows上,但我会看看是否可以稍后通过valgrind运行它。
fopen
可能会失败。你应该小心。工作目录可能不一样。试着通过valgrind之类的工具运行它?这将识别出你在内存中做傻事的地方,你的代码缺少错误处理。当然你会得到UB结果。这是一个学校作业,我知道文本文件名为zigzag.txt,它将在同一个工作目录中。如果zigzag.txt在同一工作目录中,我不知道为什么fopen会失败。我在windows上,但我会看看是否可以稍后通过valgrind运行它。
10
9 8 7 6 8 4 2 3 2 1