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