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