2013-10-31 16 views
6

Tôi cố gắng để sử dụng memset trên mảng 2D thuần túy, sử dụng đoạn mã sau:memset không làm việc

#include <iostream> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    int l[3][3]; 
    memset (l, 1, sizeof(l)); 
    for (int i = 0; i < 3; i++) { 
     for (int j = 0; j < 3; j++) { 
      cout << l[i][j] << " "; 
     } 
     cout << endl; 
    } 
    return 0; 
} 

Tôi muốn toàn bộ mảng được khởi tạo bởi 1 sử dụng dòng:

memset (l, 1, sizeof (l));

Nhưng tôi không nhận được giá trị mong đợi, nó mang lại cho tôi những kết quả sau:

16843009 16843009 16843009 
16843009 16843009 16843009 
16843009 16843009 16843009 

Nghĩ rằng nó có thể là một vấn đề biên dịch, vì vậy tôi cố gắng sử dụng Ideone:

http://ideone.com/VFYUDg

Xin vui lòng giúp đỡ.

Trả lời

17

memset công trình trên byte, vì vậy nó lấp đầy mảng của bạn ints với 0x01010101 giá trị (giả sử int là 32 bit) là số thập phân 16843009.

Nếu bạn cần phải điền vào một mảng 2 chiều C-phong cách với một số:

int l[3][3]; 
std::fill_n(*l, sizeof l/sizeof **l, 1); 

*l đây phân rã int[3][3] thành một con trỏ đến phần tử đầu tiên của mảng (int*), sizeof l/sizeof **l mang tính của các phần tử mảng.

Nó sử dụng yêu cầu C++ mà mảng được đặt ra liên tục trong bộ nhớ không có khoảng trống, do đó mảng đa chiều có cùng bố cục như các chiều đơn. Ví dụ. int [3][3] có cùng bố cục như int[3 * 3].

Và, không giống như memset, std::fill_n hoạt động ở cấp đối tượng, không phải trên byte. Đối với các kiểu tích hợp, phiên bản được tối ưu hóa thường được inline dưới dạng hướng dẫn SIMD, không kém hiệu quả hơn memset.

+0

vì vậy nếu tôi muốn khởi tạo toàn bộ mảng với giá trị số nguyên nói 1 hoặc 2, tôi nên sử dụng cái gì? – shivshnkr

+0

@ user123456 Sử dụng 'std :: fill' hoặc' std :: fill_n'. –

4

Trên thực tế, nó làm việc rất tốt ...

16843009 là đại diện thập phân của 0x01010101 (hex).

memset thực hiện công việc của mình, nghĩa là nó đã khởi tạo mọi byte trong vùng bộ nhớ được cung cấp tới 0x01.

+0

vì vậy làm thế nào để sử dụng memset để khởi tạo mảng của tôi đến một giá trị số nguyên khác 0? – shivshnkr

+0

@ user123456 'memset' sẽ __always__ hoạt động trên cơ sở byte. Vì vậy, bạn sẽ chỉ có thể khởi tạo mảng của bạn với một mẫu byte định kỳ. – Rerito

-2

Nếu mục tiêu của bạn là để thiết lập từng hạng mục của mảng tới 1 thì sau đây sẽ làm công việc của bạn,

int l [3] [3] = {1,1,1,1,1,1 , 1,1,1};

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