2013-07-30 48 views
8

Làm cách nào để khởi tạo một mảng động được phân bổ với malloc? Tôi có thể làm điều này:Khởi tạo các mảng động C

int *p; 
p = malloc(3 * sizeof(*p)); 
p = {0, 1, 2}; 

... 

free(p); 

Hoặc làm tôi cần phải làm một cái gì đó như thế này:

int *p, x; 
p = malloc(3 * sizeof(*p)); 
for (x = 0; x < 3; x++) 
    p[x] = 0; 

... 

free(p); 

Hoặc là có một cách tốt hơn để làm điều đó?

+1

Bạn có nghĩa là 'p [x] = x;' thay vì 'p [x] = 0;'? – Mysticial

+1

Phương pháp thứ hai là cách chính xác. Người đầu tiên nhận được một lỗi biên dịch, phải không? – Barmar

+0

http://fydo.net/gamedev/dynamic-arrays cho biết cách sử dụng mảng động. trên thực tế, đó là một liên kết rất phổ biến và bạn có thể tìm thấy nó với bất kỳ công cụ tìm kiếm nào ... – franklin

Trả lời

1

Tôi nghĩ rằng cách tẻ nhạt hơn là cách duy nhất để làm điều đó. Tôi cố gắng là người đầu tiên và nó không biên dịch (Sau khi bình luận các '...')

Không nhiều phím tắt trong 'C' Tôi guess.ac

+0

Tôi đã nghe nói rằng một số lập trình viên sử dụng hàm memset() cho một cái gì đó như thế này. –

+0

@JustinChadwell Bạn không thể sử dụng 'memset' cho điều này: http://stackoverflow.com/questions/7202411/memset-integer-array?rq=1 –

+1

@ShafikYaghmour: Nếu ai đó muốn xóa mảng bằng 0,' memset 'hoàn toàn ổn. – phoxis

3

p = {1,2,3} là sai rồi.

Bạn có thể không bao giờ sử dụng này:

int * p; 
p = {1,2,3}; 

vòng lặp là đúng

int *p,i; 
p = malloc(3*sizeof(int)); 
for(i = 0; i<3; ++i) 
    p[i] = i; 
14

Bạn cần phải phân bổ một khối bộ nhớ và sử dụng nó như một mảng như:

int *arr = malloc (sizeof (int) * n); /* n is the length of the array */ 
int i; 

for (i=0; i<n; i++) 
{ 
    arr[i] = 0; 
} 

Nếu bạn cần khởi tạo mảng bằng số không, bạn cũng có thể sử dụng hàm memset từ stdlib.

memset (arr, 0, sizeof (int) * n); 

Đây là hằng số mà mọi locatoin của mảng sẽ được đặt. Lưu ý rằng đối số cuối cùng là số byte được đặt là hằng số. Bởi vì mỗi vị trí của mảng lưu trữ một số nguyên do đó chúng tôi cần phải vượt qua tổng số byte như tham số này.

Ngoài ra nếu bạn muốn xóa mảng thành số không, thì bạn có thể muốn sử dụng calloc thay vì malloc. calloc sẽ trả về khối bộ nhớ sau khi đặt các vị trí byte được phân bổ về 0.

Sau khi bạn đã hoàn tất, hãy giải phóng khối bộ nhớ free (arr).

EDIT1

Lưu ý rằng nếu bạn muốn gán một số nguyên đặc biệt tại các địa điểm của một mảng số nguyên sử dụng memset sau đó nó sẽ là một vấn đề. Điều này là do memset sẽ diễn giải mảng dưới dạng mảng byte và gán byte mà bạn đã cung cấp cho mỗi byte của mảng. Vì vậy, nếu bạn muốn lưu trữ nói 11243 ở mỗi vị trí sau đó nó sẽ không thể.

EDIT2

Cũng lưu ý do tại sao mỗi khi thiết lập một mảng int 0 với memset có thể không hoạt động: Why does "memset(arr, -1, sizeof(arr)/sizeof(int))" not clear an integer array to -1? như chỉ ra bởi @Shafik Yaghmour

15

Thay vì sử dụng

int * p; 
p = {1,2,3}; 

chúng tôi có thể sử dụng

int * p; 
p =(int[3]){1,2,3}; 
+2

Đây chính xác là những gì tôi đang tìm kiếm! Siêu hữu ích nếu mỗi phần tử riêng lẻ có giá trị riêng của nó, những gì không thể được tính theo bất kỳ cách nào, do đó bạn kết thúc việc viết khởi tạo cho từng phần tử riêng lẻ. Một câu hỏi: nó là một phần của bất kỳ tiêu chuẩn C nào, hay là trình biên dịch cụ thể? – Ignas2526

+4

Đây không phải là một thay thế thả cho một mảng 'malloc'-ed! Chữ hợp chất bạn đang sử dụng để khởi tạo 'p' có thời lượng lưu trữ tự động. Nó sẽ được giải phóng tự động ở cuối khối, và gọi 'tự do' trên nó theo cách thủ công là hành vi không xác định. Bạn không thể sử dụng điều này để cấp phát một mảng mà bạn sẽ trả lại hoặc phân bổ bất kỳ thứ gì mà phải tồn tại vượt quá khối hiện tại. – user2357112

2

Bạn không thể sử dụng cú pháp bạn đã đề xuất. Nếu bạn có một trình biên dịch C99, tuy nhiên, bạn có thể làm điều này:

int *p; 

p = malloc(3 * sizeof p[0]); 
memcpy(p, (int []){ 0, 1, 2 }, 3 * sizeof p[0]); 

Nếu trình biên dịch của bạn không hỗ trợ C99 literals hợp, bạn cần phải sử dụng một mẫu tên là sao chép từ:

static const int p_init[] = { 0, 1, 2 }; 
int *p; 

p = malloc(3 * sizeof p[0]); 
memcpy(p, p_init, 3 * sizeof p[0]); 
+0

+1 câu trả lời hay. –

Các vấn đề liên quan