objective-c - 我的 C 字符串反向函数的 Stange 行为

标签 objective-c c c-strings

我只是一个业余程序员... 在第二次阅读时,相隔两年多,kochan 的“Programming in 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;
}

第二个注意事项:

此代码在 MacBook Pro 中编译,使用 MAC OS X Maverick,使用 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 函数保持原样,我只有空白行,而 ma​​in 中的最后一个 printf block ,每个参数传递一条黑线...

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

任何人都可以在这里带来一些光:)

最佳答案

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

关于objective-c - 我的 C 字符串反向函数的 Stange 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25603908/

相关文章:

iphone - 将表示图像的 NSMutableData 保存到 iPhone 照片库

iphone - 导航 Controller 上的编辑按钮不进入编辑模式

ios - 核心数据更改处理时出错

c - 父子进程使用信号同步

c - 头文件中的静态内联函数

c - 任意位计数器

c - 在 C 中分配结构的字符串字段

c++ - 你如何将 CString 和 std::string std::wstring 相互转换?

c++ - 如何将 `CString` 转换为 `CHAR *` ?

objective-c - 核心数据多对多关系的正确删除规则?