这可能是一个非常新手的问题,但我真的无法对我的案例应用任何其他答案。
说我有这段代码:
int sizemes=0;
char letrarand()
{
int sizemes = 31;
char mesaleat[31] = { ' ' };
char *pMesaleat;
pMesaleat = mesaleat;
int numaleat = 0, i=0;
int randascii = 0;
srand(time(NULL));
for (i = 0; i < 31; i++)
{
numaleat= rand() % 26;
randascii = numaleat + 65;
*(pMesaleat+i) =randascii;
printf("%c \t",*(pMesaleat+i));
}
return 0;
}
其中letrarand是一个函数,它将创建一个包含31个元素的数组,并为每个元素分配一个随机大写字母。现在它可以工作,但我希望能够根据变量sizeofmes调整数组的大小,这样如果该变量(在函数之外)是15,那么数组将有15个元素,依此类推。出于某种原因,我不能这样做,任何想法?
答案 0 :(得分:4)
C99支持可变长度数组(它在C11中是可选的,您可以使用宏__STDC_NO_VLA__
检查它是否不受支持)。
所以,你可以这样做:
int sizemes = 31;
char mesaleat[sizemes];
如果您的实施不支持VLA(或使用C89),那么您可以诉诸malloc()
:
char *mesaleat = malloc(sizemes * sizeof *mesaleat);
if (!mesaleat) {
/* error */
}
等等。
注意:完成后,请在free()
上致电mesaleat
。
答案 1 :(得分:0)
您声明sizmes
两次,这是您不想做的。编译器不知道使用哪一个。如果以后需要它们,你还应该在函数之外声明你的指针。无论哪种方式,您都希望确保在完成时Free
它们以避免内存泄漏。在函数之外声明并初始化它们,然后在其中使用它,如下所示:
int sizemes = 31;
char *pMesaleat;
char letrarand()
{
char mesaleat[sizemes] = { ' ' };
pMesaleat = mesaleat;
int numaleat = 0;
int randascii = 0;
srand(time(NULL)):
for (int i = 0; i < sizemes; i++)
{
numaleat= rand() % 26;
randascii = numaleat + 65;
*(pMesaleat+i) = randascii;
printf("%c \t",*(pMesaleat+i));
}
return 0;
}
if (pMesaleat)
Free(pMesaleat);