2016-12-21 2 views
0

Возможно, это действительно вопрос новичков, но я действительно не мог применить ни один из других ответов на мой случай.Настройка размера массива в соответствии с переменной

Говорят, что у меня есть этот кусок кода:

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

1. 'int sizemes' объявляется как внутри, так и внутри функции. 2. '* (pMesaleat + i) = randascii;' где 'randascii' является' int', а '* (pMesaleat + i)' является 'char'. В качестве ответа вы не должны использовать массивы 'char mesaleat [31]', но вместо этого используйте [malloc] (http://man7.org/linux/man-pages/man3/malloc.3.html). например 'char * pMesaleat = (char *) malloc (sizeofmes * sizeof (char))'. – CristiFati

+1

@CristiFati: Это чепуха! Такой малый массив лучше автоматический. OP может использовать VLA для создания переменной длины: 'char mesaleat [sizemes]'. – Olaf

ответ

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); 
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 после того, как вы закончите с этим.

+0

В качестве побочного элемента: лучший способ справиться с компиляторами, не поддерживающими VLA: стереть с диска. Любой современный C11-компилятор также поддерживает режим C99, и ни один из них не поддерживает VLA в режиме C11. – Olaf

Смежные вопросы