2012-03-24 8 views
9

Tôi có một cấu trúc có một số mảng bên trong nó. Các mảng có kiểu unsigned char [4].Khởi tạo các giá trị của mảng trong một cấu trúc

tôi có thể khởi tạo mỗi phần tử bằng cách gọi

struct->array1[0] = (unsigned char) something; 
... 
struct->array1[3] = (unsigned char) something; 

Chỉ cần tự hỏi nếu có một cách để khởi tạo tất cả 4 giá trị trong một dòng.

GIẢI PHÁP: Tôi cần tạo một mảng tạm thời với tất cả các giá trị được khởi tạo, sau đó gọi memset() để sao chép các giá trị vào mảng cấu trúc.

+0

Tất cả cùng một giá trị? – hmjd

+0

Tôi phải nói rằng điều này rất nổi tiếng là một số googling sẽ tiết lộ câu trả lời một cách nhanh chóng ... http://stackoverflow.com/questions/201101/how-to-initialize-an-array-in-c ;-) – tchap

Trả lời

5

Nếu các giá trị giống nhau, bạn có thể làm đôi khi hing như

struct->array[0] = struct->array[1] = struct->array[2] = struct->array[3] = (unsigned char) something; 

Ngược lại, nếu các giá trị được lưu trữ trong một mảng, bạn có thể sử dụng chức năng memcpy như vậy

memcpy(struct->array, some_array, sizeof(struct->array)); 
+0

Đây là những gì tôi cần làm. Tôi đã cố gắng tạo ra một mảng tạm thời và làm cho nó bằng nhau nhưng tôi cần phải memcpy. Cảm ơn! –

23

Nếu bạn thực sự có nghĩa là "khởi tạo" theo nghĩa là bạn có thể làm điều đó tại thời điểm bạn khai báo biến, sau đó chắc chắn:

struct x { 
    unsigned char array1[4]; 
    unsigned char array2[4]; 
}; 

struct x mystruct = { 
    { 1, 2, 3, 4 }, 
    { 5, 6, 7, 8 } 
}; 
+0

Tôi có ý nghĩa nhiều hơn theo nghĩa rằng khi cấu trúc được tạo để chỉnh sửa từng giá trị với các mảng. –

+3

Gotcha - sau đó bạn có thể sử dụng 'memset()' để đặt tất cả chúng thành cùng một giá trị, hoặc tạo một mảng mẫu và 'memcpy()' nếu bạn muốn chúng khác nhau. Bên cạnh đó, khá nhiều tất cả những gì bạn có thể làm là gán từng cái một. –

+0

Cảm ơn, memset là những gì tôi cần. –

2

Có:

struct Foo 
{ 
    unsigned char a[4]; 
    unsigned char b[4]; 
}; 

struct Foo x = { { 1, 2, 3, 'a' }, { 'a', 'b', 'c', 0 } }; 
10

Khi bạn tạo struct, bạn có thể khởi tạo nó với initialisation tổng hợp:

struct test { 
    int blah; 
    char arr[4]; 
}; 

struct test = { 5, { 'a', 'b', 'c', 'd' } }; 
2

Tôi thấy bạn có một con trỏ (phải không?).

Nếu bạn cấp phát bộ nhớ cho con trỏ có calloc() mọi thứ bên trong cấu trúc sẽ được khởi tạo với 0.

Nếu không, bạn cần phải memset() đến 0 hoặc chỉ định giá trị từng phần tử.

memset(struct_pointer, 0, sizeof *struct_pointer); 
+0

Cảm ơn bạn. Phần memset là điều đã giúp tôi. –

0

Bạn có thể lặp quá:

for(i = 0; i < 4; i++) the_struct->array1[i] = (unsigned char) something; 

này sẽ làm việc ngay cả khi bạn chưa char nhưng ví dụ int (và giá trị! = 0). Trong thực tế, memsetting để, nói rằng, 1 cấu trúc làm bằng int (khi sizeof int lớn hơn 1) không phải là cách chính xác để khởi tạo chúng.