我的C字符串反向函数的奇怪行为

时间:2014-09-01 10:37:35

标签: objective-c c c-strings

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

首先是代码:

这是一个.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 主要功能。

如果我取消注释那些评论 printf 函数中的一个,并且只是一个,那么一切都运行得很好,我得到了正确的 printf 结果,包括主要功能中的最后一个 printf

如果我将所有那些评论过的 printf 功能保留原样,我只有空白线,最后一个 printf main 阻止,每个参数传递一条黑线......

最糟糕的是,如果我在主要中使用 NSPrint 功能,而不是 printf ,我会得到所需的结果:!

任何人都可以在这里点亮:)

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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