我只是一个业余程序员...... 在第二次阅读,相隔超过两年时,kochan的“Objective-C编程”,现在是第6版,到达指针章节,我试图重振过去,当我开始使用C编程时。 。 所以,我尝试编写一个反向C字符串函数,使用char指针... 最后我得到了理想的结果,但......也有一种非常奇怪的行为,我无法用我的小编程经验来解释......
首先是代码:
这是一个.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在MacBook Pro中编译, CLANG (clang -fobjc-arc $ file_name -o $ file_name_base)
NSPrint 只是 printf 的包装,用于打印使用 stringWithFormat:arguments: <构建的 NSString / p>
第三个奇怪的行为:
如果我取消注释所有那些评论过的 printf 声明,一切正常,即所有 printf 函数都会打印出要打印的内容,包括最后的 printf 主要功能。
如果我取消注释那些评论 printf 函数中的一个,并且只是一个,那么一切都运行得很好,我得到了正确的 printf 结果,包括主要功能中的最后一个 printf 。
如果我将所有那些评论过的 printf 功能保留原样,我只有空白线,最后一个 printf main 阻止,每个参数传递一条黑线......
最糟糕的是,如果我在主要中使用 NSPrint 功能,而不是 printf ,我会得到所需的结果:!
任何人都可以在这里点亮:)
答案 0 :(得分:4)
您将返回一个本地数组,该函数在函数退出时超出范围。取消引用该内存会导致未定义的行为。
答案 1 :(得分:1)
您正在返回一个指向被调用函数的局部变量的指针。当该函数返回时,局部变量的内存变为无效,返回的指针是垃圾。