буфер становится NULL после переиндексации - PullRequest
0 голосов
/ 12 октября 2010
#include <stdio.h>
#include <stdlib.h>
char *color[] =
{
    /*0*/"red||bluegreen",
    /*1*/"blue",
    /*2*/"green",
         "\0"
};

int fun1(char * str1)
{
    int c = 0;
    while(1)
    {
        if(str1[c] == '|' && str1[c+1] == '|')
            return c;
        c++;    
    }
    return 0;    
}


1. int main()
2. {
3.  int ret=0, offset=0;
4.  ret = fun1(color[offset]);
5   offset += ret;
6   ret = fun1(color[offset]);

7   return 0;
   }

В приведенном выше фрагменте кода в main() в строке 6 аргумент fun1() равен color[offset] = NULL Почему color[offset] = NULL после операции offset += ret.Пожалуйста, уточните

Спасибо

Ответы [ 2 ]

3 голосов
/ 12 октября 2010

Первый вызов fun1 здесь ret = fun1(color[offset]); возвращает 3, поскольку color[0][3] и color[0][4] оба |.

Затем вы добавляете ret к offset, делая его3.

В следующем вызове fun1 вы передаете его color[offset], который является color[3], что является "\0", обратите внимание, что это не NULL егостроковый литерал, содержащий только символ nul.

Чтобы уточнить:

char *str = NULL;  // str is null pointer.
char *str = 0;     // same as above.

char *str = "\0";  // str is pointer to an empty string literal.
char *str = "";    // same as above.
0 голосов
/ 12 октября 2010

Когда вы добавляете к смещению, оно будет увеличиваться на число, равное ret.Таким образом, он продвигается на 3 позиции, что приводит к смещению в 3, поэтому color[offset] = color[3] = "\0".Когда вы затем вызываете fun1, он зациклится навсегда, потому что нет символов |.Это продолжается до тех пор, пока не случится что-то ужасное и неопределенное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...