2016-01-04 4 views
-2

У меня была проблема сегодня, когда я кодировал функцию, которая использует static char* в C. Позвольте мне объяснить: моя функция находит '\n' в буфере, который мы ей отправляем, и если есть текст за '\n', он должен помещать этот текст в статическую переменную, которая называется rest. Дело в том, что оно запасает его, но содержание rest не сохраняется между двумя вызовами функции. И я не понимаю, почему это происходит, несмотря на то, что оно объявлено как статическая переменная.Статическая переменная в C не «работает»

Вот моя функция до сих пор: (return (1) означает, что функция не нашел либо \n и \0, return (0) означает, что функция нашла \n (return -1) означает, что функция нашла EOF)

static int end_line(char *buf, char **line) 
{ 
    static char *rest; 
    char  *tmp; 

    rest = NULL; 
    tmp = ft_strnew(ft_strlen(buf)); 
    tmp = buf; 
    printf("REST BEGINNING : %s\n", rest); 
    if (rest != NULL) 
    { 
     tmp = ft_strnew(ft_strlen(rest) + ft_strlen(buf)); 
     tmp = ft_strcat(rest, buf); 
    } 
    if (!ft_strchr(tmp, '\n') && ft_strchr(tmp, '\0') == NULL) 
    { 
     rest = tmp; 
     return (1); 
    } 
    else 
    { 
     ft_putstr("OK\n"); 
     *line = ft_strsub(tmp, 0, (ft_strlen(tmp) - ft_strlen(ft_strchr(tmp, '\n')))); 
     rest = ft_strchr(tmp, '\n') + 1; 
     if (ft_strlen(ft_strchr(tmp, '\0')) == 0) 
      return (-1); 
     return (0); 
    } 
} 
+0

Где еще 'test_static' используется отдельно от его декларации? –

+1

'rest = NULL;' ?? – Olaf

+0

Извините test_static - это тест, который я забыл удалить перед публикацией ^^ И в чем проблема, инициализирующая отдых NULL? –

ответ

3

Одна из основных проблем заключается в том, что каждый раз, когда функция называется вами, вы вызываете . ПереведитеNULL в rest, вместо того, чтобы изначально просто инициализировать rest.

Просто удалите назначение, static Локальные переменные по умолчанию инициализируются нулем (т. Е. Указатели будут NULL).

Если вы хотите явно инициализировать его, сделайте это в объявлении. например:

static char *rest = NULL; 
+0

Но статическая переменная инициализируется только один раз, правильно? Когда я тестирую без его инициализации или инициализируя его в декларации, программа делает segfault ... –

+0

@S_Mindcore Затем вам нужно выяснить, почему. Одна из причин может заключаться в том, что вы присваиваете 'rest'' buf' (косвенно в любом случае). Будет ли срок жизни 'buf' (вернее, первым аргументом, который вы изначально переходите на функцию) переживает использование' rest'? Вы также должны выяснить способ сброса 'rest'. На самом деле есть много неизвестных в коде, который вы показываете, каковы функции 'ft_ *' и что они делают? И вы пытались запустить в отладчике, чтобы поймать крах в действии? –

+0

Я постараюсь сбросить отдых и узнать, не повлияет ли жизнь на воздействие буфа на отдых, спасибо! Все функции ft_ * точно такие же, как и у libc, я написал их сам, но они делают ту же работу, без сомнения. (кроме strnew, он создает новую строку, инициализированную до NULL с параметром размера) Не думал о запуске в отладчике ... –

Смежные вопросы