2015-07-11 2 views
1

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

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

static char* selection; 

static char* sel_item(char* text) 
{ 
    char* pch; 
    char buf[80]; 
    strcpy(buf, text); 
    pch = strtok(buf, " "); 
    return pch; 
} 

static int display_ecnt_codes(char* text) 
{ 
    char buf[80]; 
    strcpy(buf, text); 
    selection = sel_item(buf); 
    // why if I output the selection here, the selection is random char, not the correct char "SRFPRO". 
    // printf("display_ecnt_codes: %s\n", selection); 
} 

int acode_prockey() 
{ 
    char text[] = "SRFPRO - Surface Protection (DealerProduct)"; 
    display_ecnt_codes(text); 
    // why if I output the selection here, it prints the correct char string "SRFPRO". 
    // what's the difference between this scope and the above scope? 
    printf("acode_prockey: %s\n", selection); 
} 

int main() 
{ 
    acode_prockey(); 
    // it will output SRFPRO, the first token of the char text[]. 
    printf("main: %s\n", selection); 
} 

Я надеюсь, что кто-то сможет объяснить глобальный статический вариант «выбор». Когда я печатаю его внутри функции «display_ecnt_codes», он выдает случайный символ. Если я не распечатываю его внутри функции, он выводит правильный символ в основной функции.

+0

Возможный дубликат [Dangling Pointer in C] (http://stackoverflow.com/questions/5289015/dangling-pointer-in-c) – ruakh

+0

После возврата sel_item buf больше не существует (поскольку buf является локальной переменной, сохраненной в стеке). Таким образом, pch (который указывает на где-то внутри buf) является недопустимым, и вы вызываете неопределенное поведение (все может случиться, ваша программа может сбой и т. Д.). Вам нужно выделить buf в sel_item с помощью malloc (и не забудьте бесплатно!). Я бы посоветовал узнать больше о том, как распределение памяти и время жизни работают на C. – Lalaland

ответ

3

В следующей функции вы возвращаете указатель, который недействителен после возвращения функции.

static char* sel_item(char* text) 
{ 
    char* pch; 

    // An array on the stack 
    char buf[80]; 
    strcpy(buf, text); 

    // A pointer to some element of the array. 
    pch = strtok(buf, " "); 

    // Returns a pointer that is not valid after the function returns. 
    return pch; 
} 

Позже вы используете этот недопустимый указатель, который хранится в selection. Из-за этого ваша программа демонстрирует неопределенное поведение.

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