我不确定这是否是错误或我只是缺少一些东西。我已经使用Code :: Blocks和CodeLite的MinGW的gcc版本4.8.1(tdm-2)以及另一个库(SFML)进行了尝试。每当我将库链接到程序时,对参数的读取方式与将库直接添加到程序中时的读取方式是不同的。这是我写的一个自定义库,只有一个大文件;我将其添加到项目中以快速找出库中的一些错误。将库直接编译到项目中后,一切正常。当我将库链接到项目时,长参数被删减。我将其简化为以下代码段:
unsigned int count = 0; count2 = 0;
char charbuffer[128] = {0};
do
{
printf("\nBefore Count: %3d, Count2: %3d, Addthem: %3d, Next: %02X", count, count2, count+count2, argv[5][count+count2]);
for(count = 0; argv[5][count+count2] != 0 && count < 128; ++count)
charbuffer[count] = argv[5][count+count2];
count2 += count;
printf("\nAfter Count: %3d, Count2: %3d, Addthem: %3d, Next: %02X", count, count2, count+count2, argv[5][count+count2]);
}
while(argv[5][count+count2] != 0);
参数的长度为344个字节(我在键盘上将其捣碎),并且当库直接位于程序中时,它循环4次,这正是我想要的。当我删除文件并链接库时,它仅运行2次。当我添加一个printf(“%s”,argv [5]); 它总是打印出完整的参数,在此之前我有一个计数器来检查参数的长度,因此我知道它已正确发送到程序中了;而且每次运行我总是使用相同的参数。
Output when in project:
Before Count: 0, Count2: 0, Addthem: 0, Next: 32
After Count: 128, Count2: 128, Addthem: 256, Next: 79
Before Count: 128, Count2: 128, Addthem: 256, Next: 79
After Count: 128, Count2: 256, Addthem: 384, Next: 6D
Before Count: 128, Count2: 256, Addthem: 384, Next: 6D
After Count: 88, Count2: 344, Addthem: 432, Next: 4E
Before Count: 88, Count2: 344, Addthem: 432, Next: 4E
After Count: 0, Count2: 344, Addthem: 344, Next: 00
Output when linked:
Before Count: 0, Count2: 0, Addthem: 0, Next: 32
After Count: 128, Count2: 128, Addthem: 256, Next: 79
Before Count: 128, Count2: 128, Addthem: 256, Next: 79
After Count: 128, Count2: 256, Addthem: 384, Next: 00
据我所知,链接之前,出现问题之前,似乎限制了334个字节。Linux GCC似乎不受此错误影响。当我将其编译为带有或不带有链接的64位应用程序时,该错误似乎发生了。发生此问题时,不会更改文件。必须至少使用库的一部分。
谁能确认这是一个错误?我还应该发布其他内容吗?谢谢。
您有一个错误:count
评估前,您应该将其清零while(argv[5][count+count2] != 0);
。
如果不这样做,您将argv
超出范围访问数组,这在每个构建中可能会有所不同。
...
count2 += count;
printf("\nAfter Count: %3d, Count2: %3d, Addthem: %3d, Next: %02X", count, count2, count+count2, argv[5][count+count2]);
count = 0; // add this
}
while(argv[5][count+count2] != 0);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句