2014-01-08 3 views
1

Я хочу написать функцию, возвращающую часть другого массива. Вот как я пытался реализовать его:Почему я не могу назначить массив подмножеству другого массива?

char *subarrayWithRange(char *array, int location, int length) 
{ 
    char subarray[length]; 
    subarray = (array + location); 
    return subarray; 
} 

Когда я пытаюсь скомпилировать его, clang дает мне эту ошибку:

error: array type 'char [length]' is not assignable 

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

char *subarrayWithRange(char *array, int location, int length) 
{ 
    char *subarray; 
    subarray = (array + location); 
    return subarray; 
} 

Теперь, однако, я не могу определить длину подмассива. Это вещь на языке C? Могу ли я обойти это как-то?

+0

Вы должны инициализировать массив. Или назначьте его отдельные элементы. –

+0

посмотреть на этот вопрос [ссылка] (http://stackoverflow.com/questions/2137361/what-is-the-best-way-to-create-a-sub-array-from-an-exisiting-array -in-c) – Android

+0

Вы можете определить свою собственную структуру Array и затем вернуть ее. Например, в APR вы создаете массив с чем-то вроде этого: 'apr_array_header_t * arr = apr_array_make (пул, 0, sizeof (const char *));' Сделайте это аналогичным образом для своей собственной структуры. – Brandin

ответ

4

Вы не можете назначить массивы. Вы также не можете вернуть локальный массив, так как используемая память выходит из области действия при выходе из функции. Вы должны использовать динамическую (кучную) память, используя, например, malloc().

Кроме того, вы должны прекратить суб-массив, если вы собираетесь, чтобы быть правильной строкой:

char * substringWithRange(const char *string, size_t start, size_t length) 
{ 
    char *p = malloc(length + 1); 
    if(p != NULL) 
    { 
    memcpy(p, string + start, length); 
    p[length] = '\0'; 
    } 
    return p; 
} 

Обратите внимание, что выше предполагает, что length никогда не превышает длину входного, так что не проверяется , Вероятно, вы должны добавить такие проверки и просто усечь.

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