有没有办法在每次调用函数后返回一个用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;
}
答案 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