这条代码加static和不加static有什么区别啊?


#include 
#include 
#include 
#define LEN 256

int main(void)
{
    char **pt;
    int i, n, length;
    static char temp[LEN];

    printf("How many words do you wish to enter? ");
    scanf("%d", &n);
    if ((pt = (char **)malloc(n * sizeof(char *))) != NULL)
    {
        printf("Enter %d words now:\n", n);
        for (i = 0; i < n; i++)
        {
            scanf("%255s", temp);
            length = strlen(temp) + 1;
            pt[i] = (char *)malloc(length * sizeof(char));
            //↑使用malloc分配足够的存储空间来存储单词;
            if (NULL == pt[i])
            {
                printf("Memory allocation failed!\n");
                exit(EXIT_FAILURE);
            }
            strcpy(pt[i], temp);
            //↑从临时数组中把单词拷贝到动态分配的存储空间中;
        }
        printf("Here are your words:\n");
        for (i = 0; i < n; i++)
        {
            puts(pt[i]);
            free(pt[i]);
            pt[i] = NULL;
        }
        free(pt);
        pt = NULL;
        //↑指针仍然指向malloc分配的存储空间;
        //↑因此令指针指向NULL后防止内存滥用;
    }
    else
    {
        printf("Memory allocation failed!\n");
        exit(EXIT_FAILURE);
    }

    return 0;
}

这条代码加static和不加static有什么区别啊?我感觉也没什么区别啊

参考这篇文章:https://wenku.baidu.com/view/b2182af2baf3f90f76c66137ee06eff9aef8496e.html
上面的代码里,确实没什么区别,除了加static后初始化。

static修饰局部变量使得该局部变量的空间分配在静态区,这样在函数调用结束时,该变量的空间不会释放,下次调用时,可以继续使用同一块空间。所以常用于子函数中,因为子函数才会多次调用。用在main函数中,在使用上无差别,因为main函数只会调用一次。

你如果讲的是这句的话 static char temp[LEN] :
那么加static和不加static也可以说是普通局部变量与static局部变量的区别:
内存分配和释放
1、普通局部变量只有执行到变量定义的语句的时候才分配空间。
2、static局部变量在编译阶段(函数还没有执行),变量的空间已经分配。
3、普通局部变量离开作用域{ },自动释放其空间,也就无法使用此变量。
4、static局部变量只有在整个程序结束的时候才将其自动释放。
初始化
1、普通局部变量不初始化,为随机值。
2、static局部变量不初始化,为0。
3、static局部变量初始化语句只有第一次执行时有效,但是可以赋值多次。
4、static局部变量只能用它常量初始化。