函数内外的静态变量范围

时间:2015-07-11 05:13:12

标签: c

请注意静态变量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。

1 个答案:

答案 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中的无效指针。因此,您的程序会显示未定义的行为。