Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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中无法解释的行为。字符串的奇数与偶数_C_String_Network Programming - Fatal编程技术网

C中无法解释的行为。字符串的奇数与偶数

C中无法解释的行为。字符串的奇数与偶数,c,string,network-programming,C,String,Network Programming,所以我有一个我无法解决的问题。我正在用C写一些代码。我不断地遇到一些问题,从网络上阅读似乎是随机的 我最终找到了代码中字符串的数量。我不敢相信,但我已经非常深入地证实了这一点 代码库相当庞大,所以我不确定奇偶校验字符串的总数。但是我知道,如果我加一个奇数,程序就会工作,如果我加一个偶数,程序就不会工作 我只是想澄清一下,当我说它不起作用时,它仍然在构建和执行,但每次我试图通过网络阅读任何内容时,我得到的都是0。当它工作时,我得到了正确的数据 有人听说过这样的事吗?或者你知道这是什么原因吗?我可以

所以我有一个我无法解决的问题。我正在用C写一些代码。我不断地遇到一些问题,从网络上阅读似乎是随机的

我最终找到了代码中字符串的数量。我不敢相信,但我已经非常深入地证实了这一点

代码库相当庞大,所以我不确定奇偶校验字符串的总数。但是我知道,如果我加一个奇数,程序就会工作,如果我加一个偶数,程序就不会工作

我只是想澄清一下,当我说它不起作用时,它仍然在构建和执行,但每次我试图通过网络阅读任何内容时,我得到的都是0。当它工作时,我得到了正确的数据

有人听说过这样的事吗?或者你知道这是什么原因吗?我可以看到程序的数据部分是否变得太大,并开始妨碍其他代码的空间,但这是一个奇数/偶数的事实完全让我困惑

谢谢

编辑并添加更多信息:

该平台是一个定制设计的设备。代码库是redboot,但对于自定义设备,它的代码库已被显著更改

剪断,例如:

//这将起作用,因为它是奇数个字符串

char* str1 = "test";
char* str2 = "test2";
char* str3 = "test3";

int i = strlen(str1) + strlen(str2) + strlen(str3);

如果我把最后一行改成

int i = strlen(str1) + str(len2);
因此,如果str3被编译器优化,那么代码将不再工作。我已经用不同长度的字符串多次测试了这一点,所有这些字符串都会导致相同的奇偶行为。我只是被发送到一个调试日志,这样它就不会被优化了。这件事没什么特别的


Edit2:上面的代码可以放在代码库的任何地方,它会导致相同的问题。它是否被执行并不重要,这让我相信它不是堆栈溢出

我以前从未听说过这样的问题。你听起来很沮丧,你说你的代码库相当庞大。如果解决这个问题很重要,我建议您尝试用少量代码重现这个问题。如果您发布一些代码示例来说明问题,也可能有助于您在此处获得答案。

在黑暗时间随机插入


从网络套接字读取时,一个常见的误解是读取10个字节将返回下一个10个字节。不会的。它将返回最多10个字节,您可能需要多次调用read以获取所需的所有数据。

您从何处得出与字符串数奇偶性有关的断言?如果我试着仔细解释您所说的话,这告诉我代码中的微小更改会让您触发意外行为

闻起来像是堆栈溢出。您是否在堆栈上分配大数组或字符串,然后对它们进行读写操作?
在这种情况下,尝试通过malloc/free动态分配/取消分配这些大型缓冲区。

如果您有类似的情况

char buf[10];
long var;
strcpy(buf, "ganz viel text");
变量var可能会出现分段冲突或奇怪行为,也可能不会。如果在代码中放入更多调试文本,链接器可能会重新分配变量,或者编译器可能会进行其他代码优化,并重新分配内存中的空间。

这里是一个猜测

假设平台是32位的

也许编译器会将内存中程序的某些数据结构按8字节边界对齐。在数据段中有一大堆字符串指针,可能还有其他东西。如果字符串的数目为奇数,则需要进行八字节对齐的下一个字符串前面有四个字节的填充。如果有偶数个字符串,则没有填充


在八字节对齐对象之前的任何一段数据都有一个溢出错误,它只会破坏后面一到四个字节之间的内容。如果在这件事之后有填充物,就不会发生什么坏事。如果没有填充,八字节对齐的对象将被截断。

这可能是代码中的错误,而不是行数。您应该添加大量日志记录并对问题进行本地化,如果仍然需要,请在此处提出详细问题。请发布一段简短但可编译的snipper代码来说明问题。缩小问题的范围可以帮助您找到解决方案。同意。这篇文章需要隔离问题。你没有说你在哪个平台上?如果你在一个桌面系统上,你的字符串的数目或奇怪之处应该没有什么可说的。如果您使用的是更有限的嵌入式系统,那么这可能是另一个问题。很可能正如夏普顿所指出的,代码有问题。编辑:你在用我做什么?我确信,这可能是一个缓冲区溢出,与str1到str3无关,它们只是转移了问题。我想发布相同的答案。它被称为海森堡Bug:添加更多调试代码,错误就会转移到t中的另一个点
彼得:不是海森堡虫,而是海森堡虫。