【问题标题】:Can we return pointer to new static array from the same function?我们可以从同一个函数返回指向新静态数组的指针吗?
【发布时间】:2016-07-20 10:45:33
【问题描述】:

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

【问题讨论】:

  • 可以,返回本地静态对象地址即可。但每次调用同一个函数时,它都是同一个对象。如果功能不同,则不同。
  • @Serhio 这不是问题所在。 OP希望从函数的每次调用返回new数组
  • 不,没有。具有静态存储的对象由编译器放置到一个特殊的内存部分中。所以他们必须在构建时都知道。
  • @machine_1 您能描述一下您的实际问题吗?为什么你希望这些数组是静态的?简短的回答是否定的,静态内存不是在运行时分配的
  • 您不会为函数的每次调用获得一个 new 数组。这绝对不是static 所做的。相反static 确保它是同一个数组并且它存在于整个程序执行中。所以答案是否定的。

标签: c arrays pointers static


【解决方案1】:

不,static 对象根据定义只有一个实例。

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

【讨论】:

    【解决方案2】:

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

    #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 必须是一个合理的数字。

    【讨论】:

      【解决方案3】:

      不,我们不能。

      维基百科:

      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

      【讨论】:

        猜你喜欢
        • 2021-01-24
        • 2013-08-24
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 2019-01-24
        • 1970-01-01
        • 1970-01-01
        • 2015-06-17
        相关资源
        最近更新 更多