C语言static问题

C语言static问题

为什么加上static的变量在主函数中才能返回,不加static返回的就是空?

#include<string.h>
char* longestCommonPrefix(const char** strs, int strsSize) {
    char string[200];//用来存放返回结果
    int k = 0;        //用来定义数组下标
    for (int i = 0; i < strsSize; i++) //用来循环当前是第几个字符串
    {
        for (int j = 0; j <= strlen(strs[i]); j++) {//用来进行列的比较
            if (i == 0) {
                string[k] = strs[i][j];
                k++;
                continue;
            }
            else if (string[j] == strs[i][j]) {
                continue;
            }
            else {
                string[j] = '\0';
            }
        }
    }
    printf("%s\n", string);
    return string;
}
int main() {
    //定义一个字符串数组
    const char* strs[] = { "flower", "flow", "flight" };
    //计算数组长度
    int size = sizeof(strs) / sizeof(strs[0]);
    //调用函数并打印结果
    char* string;
    string = longestCommonPrefix(strs, size);
    printf("The longest common prefix is: %s\n", string);
    return 0;
}
#include<string.h>
char* longestCommonPrefix(const char** strs, int strsSize) {
    static char string[200];//用来存放返回结果
    int k = 0;        //用来定义数组下标
    for (int i = 0; i < strsSize; i++) //用来循环当前是第几个字符串
    {
        for (int j = 0; j <= strlen(strs[i]); j++) {//用来进行列的比较
            if (i == 0) {
                string[k] = strs[i][j];
                k++;
                continue;
            }
            else if (string[j] == strs[i][j]) {
                continue;
            }
            else {
                string[j] = '\0';
            }
        }
    }
    printf("%s\n", string);
    return string;
}
int main() {
    //定义一个字符串数组
    const char* strs[] = { "flower", "flow", "flight" };
    //计算数组长度
    int size = sizeof(strs) / sizeof(strs[0]);
    //调用函数并打印结果
    char* string;
    string = longestCommonPrefix(strs, size);
    printf("The longest common prefix is: %s\n", string);
    return 0;
}

char string[200];这么写的时候,string就是longestCommonPrefix函数中的一个临时变量,其作用域仅仅再longestCommonPrefix函数中,出了longestCommonPrefix函数就被编译器回收了。
而 static char string[200];则是静态变量,内存在静态数据区,跟全局变量一样,能够在程序的运行过程中一直存在,也就是出了longestCommonPrefix函数也能正常使用。

涉及到C语言变量的存储和作用域,是不是静态变量分配的存储区域也不一样,建议去学习一下相关知识。

栈上开辟的空间,函数结束会自动回收,你返回的是指针,仅仅是指针不变,指向的内容无法保证,如果想要内容不改变只能手动申请内存(malloc),或者使用全局变量或静态变量。

不加static返回的是局部变量的地址(在栈区),会报错,不知道你用的什么软件,返回局部变量的地址再使用该地址一般会报错,加上static后变量不再是局部变量(它的地址会发生变化,会在全局区),你可以输出两次string的地址看看