我正在尝试创建一个创建个性化数组的函数并将指针返回给它。我有以下代码:
int (*newArray())[COLUNAS] {
static int thisIsTheNewArray[LINHAS][COLUNAS];
/* some changes */
return thisIsTheNewArray;
}
然后,我有:
int (*tabuleiroJogador)[COLUNAS] = newArray();
int (*tabuleiroComputador)[COLUNAS] = newArray();
问题在于,如果我更改tabuleiroJogador
,我也会更改tabuleiroComputador
。我不知道为什么会这样。我认为它与static
关键字有关,它总是返回相同的实例。
阵列应不同。
答案 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
等专用函数。