Обратите внимание на статическую переменную 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», он выдает случайный символ. Если я не распечатываю его внутри функции, он выводит правильный символ в основной функции.
Возможный дубликат [Dangling Pointer in C] (http://stackoverflow.com/questions/5289015/dangling-pointer-in-c) – ruakh
После возврата sel_item buf больше не существует (поскольку buf является локальной переменной, сохраненной в стеке). Таким образом, pch (который указывает на где-то внутри buf) является недопустимым, и вы вызываете неопределенное поведение (все может случиться, ваша программа может сбой и т. Д.). Вам нужно выделить buf в sel_item с помощью malloc (и не забудьте бесплатно!). Я бы посоветовал узнать больше о том, как распределение памяти и время жизни работают на C. – Lalaland