Char array comparison in C

CAPS LOCK picture CAPS LOCK · Nov 24, 2013 · Viewed 8k times · Source

I have following function to compare two char arrays in C:

short test(char buffer[], char word[], int length) {
    int i;
    for(i = 0; i < length; i++) {
        if(buffer[i] != word[i]) {
            return 0;
        }
    }
    return 1;
}

And somewhere in main:

char buffer[5]; //which is filled correctly later
...
test(buffer, "WORD", 5);

It returns 0 immediately at i = 0. If I change function to this:

short test(char buffer[], int length) {
    int i;
    char word[5] = "WORD";
    for(i = 0; i < length; i++) {
        if(buffer[i] != word[i]) {
            return 0;
        }
    }
    return 1;
}

... it works like a charm. In the first version of function test debugger says that buffer and word arrays are type of char*. In the second version of function test it says that the buffer is type of char* and the test array is type of char[]. Function strcmp() does not work neither.

What is actually wrong here? Program is made for PIC microcontroller, compiler is C18 and IDE is MPLAB.

Answer

Remix picture Remix · Nov 24, 2013

Hmm...

Sometimes in embedded systems there is difference where strings are stored.

In the first example you define a string which is stored in flash code region only. So the comparison will fail with index 0 because of the memory area difference.

The second example you define a local variable which contain the same string. This will be located in RAM, so the comparison works since they are both in RAM.

I would test following:

char buffer[5]; //which is filled correctly later
char word[5] = "WORD";
...
test(buffer, word, 5);

Most likely it is going to work because the comparison is done in RAM totally.

Yes and remove the \0 since the "WORD" will null terminate automatically.