请注意静态变量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);
}
我希望有人可以解释全球静态变量&#34;选择&#34;。 当我在函数&#34; display_ecnt_codes&#34;中打印它时,它会输出随机字符。如果我不在函数内打印它,它会在main函数中输出正确的char。
答案 0 :(得分: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
中的无效指针。因此,您的程序会显示未定义的行为。