繁体   English   中英

我的C字符串反向函数的缠结行为

[英]Stange behavior with my C string reverse function

我只是一个业余程序员,而在第二次相隔两年多的时间里,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和CLANG的MacBook Pro中进行编译 (clang -fobjc-arc $ file_name -o $ file_name_base)

NSPrint只是printf的包装器,用于打印由stringWithFormat:arguments构造的NSString

第三,奇怪的行为:

如果我取消对所有这些注释过的printf声明的注释,则一切正常,即所有printf函数都会打印其必须打印的内容,包括main函数中的最后一个printf

如果我取消注释这些注释printf函数中的一个,并且只是随机选择一个,则一切正常,并且我得到了正确的printf结果,包括main函数中的最后一个printf

如果我将所有注释的printf函数保持原样, 则只保留空白行,并在块中保留最后一个printf ,并为传递的每个参数添加一条黑线...

更糟糕的是,如果我在main而不是printf里面使用了NSPrint函数,我会得到想要的结果:!

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

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

您将返回一个指向所调用函数的局部变量的指针。 当该函数返回时,局部变量的内存变为无效,并且返回的指针为垃圾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM