Tôi đang đấu tranh để hiểu khái niệm này: Tôi có một định nghĩa kích thước cố định:Mảng bên trong cấu trúc trong C
(từ http://msdn.microsoft.com/pt-br/library/aa931918.aspx)
typedef struct _FlashRegion {
REGION_TYPE regionType;
DWORD dwStartPhysBlock;
DWORD dwNumPhysBlocks;
DWORD dwNumLogicalBlocks;
DWORD dwSectorsPerBlock;
DWORD dwBytesPerBlock;
DWORD dwCompactBlocks;
} FlashRegion, *PFlashRegion;
FlashRegion struct này, được sử dụng trong này struct khác: (từ: http://msdn.microsoft.com/pt-br/library/aa932688.aspx)
typedef struct _FlashInfoEx {
DWORD cbSize;
FLASH_TYPEflashType;
DWORD dwNumBlocks;
WORD dwDataBytesPerSector;
DWORD dwNumRegions;
FlashRegion region[1];
} FlashInfoEx, *PFlashInfoEx;
vấn đề là, tôi có thể có một số biến của FlashRegions bên trong một FlashInfoEx. Chức năng rằng Tôi đang gỡ lỗi không một nơi nào đó trong các mã:
memcpy (pFlashInfoEx->region, g_pStorageDesc->pRegionTable,
g_pStorageDesc->dwNumRegions * sizeof(FlashRegion));
đó có nghĩa là nó sao chép một số lượng khu vực để pFlashInfoEx (mà tôi vượt qua trong các cuộc gọi của hàm);
Vì vậy, mã sẽ ghi đè bộ nhớ nếu dwNumRegions lớn hơn một. Nếu đó là trường hợp, tôi có nên tạo một FlashRegion [FIXED_SIZE] trong mã của tôi và bằng cách nào đó đặt/ghi đè trong vùng FlashInfoEx-> không? Làm thế nào để làm điều đó?
Cảm ơn, Marcelo
Chà, các bạn nhanh lên đây! Vì vậy, điều đó ngụ ý rằng khu vực phải luôn là thành viên cuối cùng của cấu trúc phải không? Tùy thuộc vào trình biên dịch, đây có phải là một rủi ro không? – Marcelo
Khi xác định cấu trúc để có thể tương tác với bất kỳ API nào bạn cần để có thể xác định bố cục bộ nhớ chính xác của cấu trúc. Tôi nghĩ tiêu chuẩn yêu cầu các thành viên cấu trúc phải được sắp xếp theo thứ tự được chỉ định, nhưng nó không chỉ định căn chỉnh. Trong thực tế tất cả các trình biên dịch cung cấp kiểm soát liên kết là tốt. – Suma
Có, khu vực phải là cuối cùng. Rủi ro? Chỉ trong ý nghĩa rằng C chính nó là nguy hiểm.Đây thực tế là ngôn ngữ được sử dụng như thế nào. Có một lý do mà các ngôn ngữ hiện đại làm cho điều này là không thể, nhưng điều đó không hồi tưởng lại mẫu thiết kế ra khỏi bộ công cụ C89 và C90. – DigitalRoss