我们可以从同一个函数返回指向新静态数组的指针吗?

时间:2016-07-20 10:45:34

标签: c arrays pointers static

有没有办法在每次调用函数后返回一个用static关键字分配的新数组?如果我对函数进行克隆,我可以创建一个新数组,但不是来自同一个函数。

考虑以下计划:

#include <stdio.h>

char *CrArray1(void);
char *CrArray2(void);

int main(void)
{
    char *p1 = CrArray1();
    strcpy(p1, "Hello, ");

    char *p2 = CrArray1();
    strcat(p2, "World");

    char *q1 = CrArray2();
    strcpy(q1, "Different String");

    printf("p1 is : %s\n", p1);
    printf("q1 is : %s\n", q1);

    return 0;
}

char *CrArray1(void)
{
    static char Array[128];
    return Array;
}

char *CrArray2(void)
{
    static char Array[128];
    return Array;
}

3 个答案:

答案 0 :(得分:1)

不,static个对象按照定义只有一个实例。

您需要使用malloc(),并且您的函数的调用者需要free()内存。

答案 1 :(得分:1)

如果在编译时您知道要调用该函数的次数,则可以使用以下内容:

#define NUMBER_OF_TIMES_FUNCTION_WILL_BE_CALLED 10
char *CrArray1(void)
{
    static int i = -1;
    static char Array[NUMBER_OF_TIMES_FUNCTION_WILL_BE_CALLED][128];
    ++i;
    return Array[i];
}

注意:NUMBER_OF_TIMES_FUNCTION_WILL_BE_CALLED必须是合理的数字。

答案 2 :(得分:0)

不,我们不能。

维基百科:

  

static用于将变量存储在静态分配的内存中,而不是自动分配的内存中。

所以如果你在q1之后添加:

char *q2 = CrArray2();
strcpy(q2, "Another String");

并打印q2,您将获得:

p1 is : Hello, World q1 is : Another String q2 is : Another String

这意味着local static变量仍然指向相同的内存。 所以结果不是我们想要的。

但是如果你使用malloc来要求新的内存功能。每次返回的函数指针都指向不同的内存。所以这些变量没有影响。

有关static的更多信息,请参阅what does static means in a C program