[英]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.