Разветвленная функция не назначает указатель - PullRequest
0 голосов
/ 05 мая 2010

В приведенном ниже коде у меня есть функция int GetTempString(char Query[]); вызов в основном работает нормально.

Однако при вызове функции из вилки вилка зависает (останавливается, без ошибок, без вывода) перед этой строкой: pch = strtok (Query," ,"); printf показывает, что указатель на pch равен нулю . Опять же, это происходит только тогда, когда его выполняет форк.

Что я делаю не так?

int main()
{
if((Timer =fork())==-1) printf("Timer Fork Failed");    
    else if(Timer==0)
    {
        while(1)
        {       
        sleep(2);       
        GetTempString("ch 1,2,3,4");        
        }
    }
    else
    {
         //CODE

         GetTempString("ch 1,2,3,4");
        }
}

int GetTempString(char Query[])
{
        char * pch;


    printf("DEBUG: '%s'-'%d'\n",Query,pch);

    pch = strtok (Query," ,");//* PROBLEM HERE*

        //while loop for strtok...

        return 1;

}

Ответы [ 3 ]

2 голосов
/ 05 мая 2010

strtok изменяет строку, на которую указывает ее первый аргумент (заменяя символы-разделители на NUL), но вы передаете строковый литерал, который неявно const. Вам нужно скопировать строку в буфер для записи перед вызовом strtok.

В вашем примере это происходит в обоих процессах, поэтому оба будут зависать. При публикации сокращенного примера для демонстрации проблемы обязательно сначала скомпилируйте и протестируйте его, чтобы убедиться, что он действительно показывает вашу проблему, а не какую-то совершенно не связанную проблему (которая может иметь место здесь).

0 голосов
/ 05 мая 2010

Переменная TempString размещена в стеке функции GetTempString. Использование этой переменной имеет смысл только внутри контекста GetTempString. Используйте статическую TempString [50] для решения этой проблемы.

0 голосов
/ 05 мая 2010

Ваша функция возвращает локальную переменную, поэтому у вас неопределенное поведение - после этого может произойти все что угодно. Вам нужно выделить строку, которую вы возвращаете динамически, используя malloc (), или передать ее функции в качестве параметра.

...