0

I'm just an amateur programmer... And when reading, for the second time, and more than two years apart, kochan's "Programming in Objective-C", now the 6th ed., reaching the pointer chapter i tried to revive the old days when i started programming with C... So, i tried to program a reverse C string function, using char pointers... At the end i got the desired result, but... got also a very strange behavior, i cannot explain with my little programming experience...

First the code:

This is a .m file,

#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;
}

Second some notes:

This code is compiled in a MacBook Pro, with MAC OS X Maverick, with CLANG (clang -fobjc-arc $file_name -o $file_name_base)

That NSPrint is just a wrapper for printf to print a NSString constructed with stringWithFormat:arguments:

And third the strange behavior:

If I uncomment all those commented printf declarations, everything work just fine, i.e., all printf functions print what they have to print, including the last printf inside main function.

If I uncomment one, and just one, randomly chosen, of those comment printf functions, again everything work just fine, and I got the correct printf results, including the last printf inside main function.

If I leave all those commented printf functions as they are, I GOT ONLY BLANK LINES with the last printf inside main block, and one black line for each argument passed...

Worst, if I use that NSPrint function inside main, instead of the printf one, I get the desired result :!

Can anyone bring some light here please :)

2 Answers 2

4

You're returning a local array, that goes out of scope as the function exits. Dereferencing that memory causes undefined behavior.

Sign up to request clarification or add additional context in comments.

1 Comment

@Sérgio Paulo Your only question "Can anyone bring some light here please" is well answered here. If you want to ask more questions, add it to your post or form a new post.
1

You are returning a pointer to a local variable of the function that was called. When that function returns, the memory for the local variable becomes invalid, and the pointer returned is rubbish.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.