簡體   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