2014-01-22 2 views
0

У меня есть проблема с функцией символ * возвращения значенияфункция символ * возвращения значения

моя функция

char * GetUnreadMessageIndexes(char * input) 
{ 
    char index [10]; 
    int i=0; 
    while(*input != ':') 
    { 
     input++; 
    } 

    input++; 

    while(*input != ',') 
    { 
     if(*input != ' ') 
     { 
     index[i]= *input; 
     i++; 
     } 

     input++; 

    } 

    return index; 
}; 

и мой тестовый код в основном является

char * b = "+CMGL:26867689, \"REC READ\",\"+81923733737\", \n test again "; 

char * a = GetUnreadMessageIndexes(b); 


while(a != ((int)a + (int) strlen(a))) 
{ 
    printf("%c",*a); 
    a++; 
} 

эта функция предположим для синтаксического анализа строки чисел после + CMGL: и до, i получить первое число только «2», а остальные значения являются неожиданными значениями и не соответствуют

+0

В зависимости от компилятора, этот сценарий, как правило, дает предупреждения/ошибки. Если это не так, вы должны включить предупреждение, так как это приведет к ошибкам, которые трудно отладить. – clcto

+0

Проверьте последнее изменение моего ответа о печати полученного массива! – rullof

ответ

1

Массив index является локальной переменной для функции GetUnreadMessageIndexes и после ее окончания index больше не существует. Используйте указатель и выделите память для 10 char, используя malloc.

Заменить:

char index[0]; 

с:

char *index = malloc(10); 

Кроме того, необходимо обнулить прекратить массив иначе strlen не будет работать должным образом с ним:

while(*input != ',') 
{ 
    if(*input != ' ') 
    { 
    index[i]= *input; 
    i++; 
    } 

    input++; 
} 
index[i] = '\0'; 

Поскольку теперь массив имеет нулевое завершение вместо использования цикла while ИНТ получившийся массив просто использовать:

printf("%s", a); 

И теперь ваш код работает, как ожидалось: Live Demo

2

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

+0

Каков альтернативный выбор без использования глобальных переменных? – MGaafar

+0

malloc память для индекса до или внутри вызова и не забудьте освободить его, когда закончите. Это может иметь смысл передать его в качестве переменной для func. Действительно зависит от того, что вы в конечном итоге делаете с ним. – Duck

1

index является локальным для функции (так как она является частью стека), которая может быть очищена или не удалена, как только функция выйдет. Цель, на которую указывает указатель, необязательно должна иметь исходные значения и может/будет/использоваться в другом месте.

+0

«... который может быть очищен ...» Это также может и не быть. Это UB, как определено стандартом. – clcto

+0

Исправлено это, хороший улов. – drahnr

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