2015-12-09 4 views
1

Скажет, у меня есть, простая структура, например, как эта:Как назначить массив на структуру в C

struct myStruct { 

    uint8_t arr[10]; 
}; 

Все, что я хочу быть в состоянии сделать это, чтобы изменить содержимое этого массива. Однако кажется, что я не могу напрямую назначить массив (т. Е. Я не могу сделать что-то вроде pointerToThisStruct-> arr = anArrayofSizeTen).

Так вот мой главный метод:

int main(int argc, char **argv) { 
    uint8_t test[10] = {0}; 
    myStruct *struc; 
    struc->arr = test; //can't do this 
    memcpy(struc->arr, test, sizeof(test)); 
} 

Теперь я понимаю, что прямое копирование через не будет работать, но почему тетср также дает мне Segfault? Как я могу изменить массив структур?

+2

Вы segfaulting, потому что вы создаете указатель к структуре. Вместо myStruct * struc; используйте myStruct struc и обратитесь к члену «arr» с помощью struc.arr. – Chimera

+0

@Chimera делает это? У меня создалось впечатление, что знак стрелки -> был тем же самым, что и отсрочить указатель, а затем использовать «.». – earre1990

+0

У вас есть указатель ... но что он указывает * на *? У вас нет фактической структуры. – Dmitri

ответ

5

Необходимо указать фактическое myStruct. Не указатель на один. Объявление указателя на один на самом деле не выделяет никакой памяти для структуры.

#include <stdio.h> 
#include <stdint.h> 
#include <string.h> 

struct myStruct { 

    uint8_t arr[10]; 
}; 


int main(int argc, char **argv) { 

    int i; 
    uint8_t test[10] = {0,1,2,3,4,5,6,7,8,9}; 
    struct myStruct struc; 
    memcpy(struc.arr, test, sizeof(struc.arr)); 


    printf("struc.arr[] = "); 

    for(i=0; i < sizeof(test); i++) 
    { 
     printf("%d ", struc.arr[i]); 
    } 

    printf("\n"); 
    return(0); 
} 
+2

Незначительный: когда есть вероятность, что источник и назначение могут иметь разные размеры с помощью memcpy() ', рекомендуем использовать размер назначения как _size_:' memcpy (struc.arr, test, sizeof struc. arr); '(или использовать тест времени компиляции для обеспечения соответствия обоих размеров) – chux

+1

@chux Хорошая точка. Код отредактирован. – Chimera

0

Вы получаете ошибку сегментации, потому что вы не выделили указатель на структуру.

int main(int argc, char **argv) { 
    uint8_t test[10] = {0}; 
    struct myStruct *struct = malloc(sizeof(struct myStruct)); 
    if (!struc) 
     return -1; 
    memcpy(struc->arr, test, sizeof(test)); 
    free(struc); 
    return 0; 
} 

Но, как уже упоминалось @Chimera, вы совершенно не можете использовать точку и непосредственно кучу распределённой структуру, а также доступ к своим внутренним полям с . оператором

+2

Не забудьте 'free (struc)' – Barmar

+0

Мой плохой. Я обновляю код в соответствии с вашими мудрыми советами. –

+1

Кроме того, не используйте 'struct' как имя переменной - это ключевое слово C. Обратите внимание, что вместо этого OP использует 'struc'. – skrrgwasme

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