我只是一个业余程序员... 在第二次阅读时,相隔两年多,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 在 main 函数中。
如果我取消注释一个,并且只随机选择一个,这些注释 printf 函数,再次一切正常,我得到了正确的 printf 结果,包括main 函数中的最后一个 printf。
如果我将所有那些注释的 printf 函数保持原样,我只有空白行,而 main 中的最后一个 printf block ,每个参数传递一条黑线...
最糟糕的是,如果我在 main 中使用 NSPrint 函数,而不是 printf 函数,我会得到想要的结果:!
任何人都可以在这里带来一些光:)
最佳答案
您正在返回一个本地数组,该数组在函数退出时超出范围。取消引用该内存会导致未定义的行为。
关于objective-c - 我的 C 字符串反向函数的 Stange 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25603908/