我在Linux上编写了一个运行得很好的程序。当我在Windows上编译并运行代码时,它始终在同一位置崩溃,并且callstack的顶部为chkstk()
。我在Code :: Blocks和VS2013中尝试了它们并且它们在同一地点崩溃,除了Code :: Blocks它是chkstk_ms()
(假设这是MinGW版本?)。
在Linux和Code :: Blocks中使用-std=c11
进行编译。
以下是相关代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <time.h>
#define LINE_SIZE 2097152
bool doUnescape = false;
int filesDehexed = 0;
void dehexFile(const char* filename);
int main(int argc, char *argv[])
{
int files = 0;
char* filenameList[argc];
if(argc < 2) {
printf("Please pass in a filename.\n");
return 0;
}
if((argc == 2) && (strcmp("-u", argv[1]) == 0)) {
printf("No filename was passed in.\n");
return 0;
} else if((argc == 2) && strcmp("-u", argv[1]) != 0) {
filenameList[0] = argv[1];
files = 1;
}
if(argc >= 3) {
for(int i = 0, j = 0; i < argc; i++) {
if(strcmp("-u", argv[i]) == 0) {
doUnescape = true;
} else if(i > 0) { //SHOULD be a file name
filenameList[j] = argv[i];
j++;
files++;
}
}
}
printf("Dehexifying %d file%s...\n", files, files <= 1 ? "" : "s");
for(int i = 0; i < files; i++) {
dehexFile(filenameList[i]);
}
printf("...%d file%s dehexed\n", filesDehexed, filesDehexed <= 1 ? "" : "s");
return 0;
}
void dehexFile(const char* filename)
{
...
}
调试时,两个(Code :: Blocks with MinGW; VS2013)指向dehexFile()
的左括号(因此,甚至不是一行代码),每个变量都为chkstk()
。在实际调用dehexFile()
的地方高几行,我甚至用一个字符串常量替换了filenameList[i]
,看看是否可能只是使用来自char*
的{{1}}来解决问题仍然做同样的事情。
这里发生了什么以及为什么在Windows上而不是Linux?