【问题标题】:Stange behavior with my C string reverse function我的 C 字符串反向函数的 Stange 行为
【发布时间】:2014-10-25 13:38:59
【问题描述】:

我只是一个业余程序员... 在第二次阅读 kochan 的“Objective-C 编程”(现在是第 6 版)时,隔了两年多,到达指针章节时,我试图恢复我开始使用 C 编程的旧时光。 . 所以,我尝试使用 char 指针编写一个反向 C 字符串函数...... 最后我得到了想要的结果,但是......也有一个非常奇怪的行为,我无法用我的一点编程经验来解释......

首先是代码:

这是一个 .m 文件,

#import <Foundation/Foundation.h>
#import "*pathToFolder*/NSPrint.m"

int main(int argc, char const *argv[])
{
    @autoreleasepool
    {
        char * reverseString(char * str);
        char *ch;

        if (argc < 2)
        {
            NSPrint(@"No word typed in the command line!");
            return 1;
        }

        NSPrint(@"Reversing arguments:");

        for (int i = 1; argv[i]; i++)
        {
            ch = reverseString(argv[i]);
            printf("%s\n", ch);
            //NSPrint(@"%s - %s", argv[i], ch);
        }
    }

    return 0;
}

char * reverseString(char * str)
{
    int size = 0;

    for ( ; *(str + size) != '\0'; size++) ;

    //printf("Size: %i\n", size);

    char result[size + 1];
    int i = 0;

    for (size-- ; size >= 0; size--, i++)
    {
        result[i] = *(str + size);
        //printf("%c, %c\n", result[i], *(str + size));
    }

    result[i] = '\0';

    //printf("result location: %lu\n", result);
    //printf("%s\n", result);

    return result;
}

第二点注意事项:

此代码在带有 MAC OS X Maverick 的 MacBook Pro 中编译,带有 CLANG (clang -fobjc-arc $file_name -o $file_name_base)

NSPrint 只是 printf 打印由 stringWithFormat:arguments: 构造的 NSString 的包装器/p>

第三个奇怪的行为:

如果我取消注释所有那些已注释的 printf 声明,一切都会正常工作,即所有 printf 函数都会打印他们必须打印的内容,包括最后一个 printf ma​​in 函数中。

如果我取消注释其中一个,并且仅随机选择一个注释 printf 函数,那么一切都会正常工作,并且我得到了正确的 printf 结果,包括ma​​in 函数中的最后一个 printf

如果我保留所有已注释的 printf 函数,我只有空白行,其中最后一个 printfma​​in 块,并为每个传递的参数设置一条黑线...

最糟糕的是,如果我在 ma​​in 中使用那个 NSPrint 函数,而不是 printf 函数,我会得到想要的结果:!

谁能给这里点灯:)

【问题讨论】:

    标签: objective-c c c-strings


    【解决方案1】:

    您正在返回一个本地数组,该数组在函数退出时超出范围。取消引用该内存会导致未定义的行为。

    【讨论】:

    • @Sérgio Paulo 您唯一的问题“任何人都可以在这里带来一些光明吗”在这里得到了很好的回答。如果您想提出更多问题,请将其添加到您的帖子中或创建一个新帖子。
    【解决方案2】:

    您正在返回一个指向被调用函数的局部变量的指针。当该函数返回时,局部变量的内存变得无效,并且返回的指针是垃圾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      相关资源
      最近更新 更多