根据变量调整数组的大小

时间:2016-12-21 15:36:26

标签: c arrays pointers

这可能是一个非常新手的问题,但我真的无法对我的案例应用任何其他答案。

说我有这段代码:

 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个元素,依此类推。出于某种原因,我不能这样做,任何想法?

2 个答案:

答案 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);