【问题标题】:printf() statement makes a difference to my return value? - C Programmingprintf() 语句对我的返回值有影响吗? - C编程
【发布时间】:2010-10-07 16:43:16
【问题描述】:

我正在尝试使用 K&R C 编程语言书中的一个函数,并使用指针来编写 strindex 函数而不是数组表示法。我有一个奇怪的问题,如果我在下面的代码中的两个点中的任何一个处包含一个 printf() 语句,那么该函数会返回正确的索引(在这种情况下为 6),但是如果我将 printf() 语句排除在外,那么函数返回 -1。

我真的不明白为什么这会产生任何影响,如果能得到任何澄清,我将不胜感激。这是我的代码:

#include <stdio.h>

int strindex(char *a, char *b) {

    char *pa;
    char *astart = a;
    char *pb = b;
    int len;

    while(*pb++ != '\0')
        len++;

    while(*a != '\0') {
        pa = a;
        pb = b;
        for(;*pb != '\0' && *pa == *pb; pa++, pb++)
            ;
        if(len > 0 && *pb == '\0') {
            return a - astart;
        }
        //printf("%c\n", *a);
        a++;
    }
    //printf("%c\n", *a);
    return -1;
}

int main() {

    char *a = "experiment";
    char *b = "me";

    printf("index is %d\n", strindex(a, b));

    return 0;
}

非常感谢

【问题讨论】:

  • 我的行为没有任何变化(除了打印出字符)...
  • 我粘贴了您刚刚发布的内容,我得到“索引为 6”作为输出。我认为您还有其他问题(例如可能没有重新编译?)
  • 看不到任何明显的错误...
  • 您的代码看起来应该可以正常工作,并且在此处使用 gcc (v4.3.4) 编译时,无论优化级别如何,它的行为确实正确(打印“索引为 6”)。您使用的是什么编译器和设置?
  • 当您添加指令以查看值时,代码的行为会发生变化...在我看来就像一个 量子纠缠 中断问题...

标签: c


【解决方案1】:

问题是自动变量len。由于您没有对其进行初始化,因此它以不确定的(垃圾)值开头。然后你增加它,所以它最终会成为“垃圾+ b的长度”。对已编译代码的任何单个更改,例如额外的 printf 调用都可以更改 len 的起始值,从而改变程序的行为。

解决方案:int len = 0;,看看是否可以从编译器中获得更多警告。如果您使用gcc,请使用-O -Wall -Wextra 标志。然后你应该得到如下警告:

strindex.c:8: 警告:“len”可能在此函数中未初始化使用

【讨论】:

  • 哈。杰出的。非常感谢肖特。它现在正在工作,我理解这个解释。鉴于 len 是垃圾,我很惊讶它完全有效。
  • 感谢您的编辑。我只使用 -Wall 。使用 -O 会给出“可能使用未初始化”警告。感谢您的提示。
  • @Joe:是的,您需要启用优化才能获得某些警告,这违反直觉。其他有用的标志是 -ansi-std=c99-pedantic 的组合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
相关资源
最近更新 更多