C 根据变量调整数组的大小

C 根据变量调整数组的大小,c,arrays,pointers,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(

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

假设我有这段代码:

 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;
}
int-sizemes=0;
char letrarand()
{
int-sizemes=31;
char mesaleat[31]={''};
char*pMesaleat;
pMesaleat=mesaleat;
int numaleat=0,i=0;
int=0;
srand(时间(空));
对于(i=0;i<31;i++)
{
numleat=rand()%26;
randascii=numaleat+65;
*(pMesaleat+i)=随机ASCII;
printf(“%c\t”,*(pMesaleat+i));
}
返回0;
}

其中,letrarand是一个函数,它将创建一个包含31个元素的数组,并为每个元素分配一个随机大写字母。现在可以了,但是我希望能够根据变量sizeofmes调整数组的大小,这样如果变量(在函数之外)是15,那么数组将有15个元素,依此类推。由于某些原因,我不能这样做,有什么想法吗?

C99支持可变长度数组(在C11中是可选的,您可以使用宏
\uuu STDC\u NO\u VLA\uuu检查它是否不受支持)。
因此,您可以:

int sizemes = 31;
char mesaleat[sizemes];
如果您的实现不支持VLA(或使用C89),那么您可以求助于
malloc()

等等


注意:完成后,在
mesaleat
上调用
free()

C99支持可变长度数组(在C11中是可选的,您可以使用宏
检查是否不支持它)。
因此,您可以:

int sizemes = 31;
char mesaleat[sizemes];
如果您的实现不支持VLA(或使用C89),那么您可以求助于
malloc()

等等


注意:完成后,在
mesaleat
上调用
free()

您声明了
sizmes
两次,这是您不想做的。编译器将不知道使用哪一个。如果以后需要,还应该在函数外部声明指针。无论采用哪种方式,您都要确保在执行操作时释放它们,以避免内存泄漏。在函数外部声明并初始化它们,然后在函数内部使用它们,如下所示:

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);
int-sizemes=31;
char*pMesaleat;
char letrarand()
{
char mesaleat[sizemes]={''};
pMesaleat=mesaleat;
int numaleat=0;
int=0;
srand(时间(空)):
对于(int i=0;i
您声明了两次
大小
,这是您不想做的。编译器将不知道使用哪一个。如果以后需要,还应该在函数外部声明指针。无论采用哪种方式,您都要确保在执行操作时释放它们,以避免内存泄漏。在函数外部声明并初始化它们,然后在函数内部使用它们,如下所示:

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);
int-sizemes=31;
char*pMesaleat;
char letrarand()
{
char mesaleat[sizemes]={''};
pMesaleat=mesaleat;
int numaleat=0;
int=0;
srand(时间(空)):
对于(int i=0;i
1
int sizemes
在函数内外都声明。2. <代码>*(pMesaleat+i)=随机ASCII
其中
randacii
int
*(pMesaleat+i)
char
。作为回答,您不应该使用数组
char-mesaleat[31]
,而应该使用。e、 g.
char*pMesaleat=(char*)malloc(sizeofmes*sizeof(char))
@CristiFati:这是胡说八道!这样一个小阵列更适合自动化。OP可以使用VLA生成长度变量:
char-mesaleat[sizemes]
.1
int sizemes
在函数内外都声明。2. <代码>*(pMesaleat+i)=随机ASCII
其中
randacii
int
*(pMesaleat+i)
char
。作为回答,您不应该使用数组
char-mesaleat[31]
,而应该使用。e、 g.
char*pMesaleat=(char*)malloc(sizeofmes*sizeof(char))
@CristiFati:这是胡说八道!这样一个小阵列更适合自动化。OP可以使用VLA生成长度变量:
char-mesaleat[sizemes]
。附带说明:处理不支持VLA的编译器的最佳方法:从光盘擦除。任何现代C11编译器也支持C99模式,并且没有一个不支持C11模式下的VLA。作为旁注:处理不支持VLA的编译器的最佳方法:从光盘擦除。任何现代C11编译器也支持C99模式,并且没有一个不支持C11模式下的VLA。