函数返回与之前相同的指针

时间:2015-02-09 20:44:43

标签: c arrays

我正在尝试创建一个创建个性化数组的函数并将指针返回给它。我有以下代码:

int (*newArray())[COLUNAS] {

    static int thisIsTheNewArray[LINHAS][COLUNAS];
    /* some changes */
    return thisIsTheNewArray;
}

然后,我有:

int (*tabuleiroJogador)[COLUNAS] = newArray();
int (*tabuleiroComputador)[COLUNAS] = newArray();

问题在于,如果我更改tabuleiroJogador,我也会更改tabuleiroComputador。我不知道为什么会这样。我认为它与static关键字有关,它总是返回相同的实例。

阵列应不同

3 个答案:

答案 0 :(得分:2)

此上下文中的

static表示数组将在调用newArray()函数之间保持其值。

如果每次调用newArray时都需要不同的数组副本,则需要动态创建它。您还需要确保在完成后正确释放它。

int* newArray(int lines, int columns)
{
   return malloc(sizeof(int) * lines * columns);
}

int* arr = newArray();
/* later... */
free(arr);

注意:这与原始语义略有不同,因为它分配了足够的空间,但数组将在单个维度中编入索引。

答案 1 :(得分:2)

正如其他人所提到的,如果你想要对函数进行不同的调用来创建不同的实例,你必须使用malloc

(好吧,你没有拥有;你可以使用一个静态数组表,如果你在程序的开头就知道你需要多少个不同的数组。)

malloc的代码可以是:

int (*newArray())[COLUNAS]
{
    int (*p)[COLUNAS] = calloc(LINHAS, sizeof *p);
    return p;
}

如果你忽视了这种可能性;可以在不使用函数的情况下创建数组:

int tabuleiroJogador[LINHAS][COLUNAS];
int tabuleiroComputador[LINHAS][COLUNAS];

或使用malloc:

int (*tabuleiroJogador)[COLUNAS] = calloc(LINHAS, sizeof *tabuleiroJogador);
int (*tabuleiroComputador)[COLUNAS] = calloc(LINHAS, sizeof *tabuleiroComputador);

答案 2 :(得分:0)

函数中的

static变量在多个调用中共享相同的内存空间,这就是我们喜欢它们的原因。此属性允许变量在调用中保留其值,从而为其提供类似于全局的功能。要根据需要动态分配内存,请使用malloc等专用函数。