Về cấu trúc và con trỏ C...
Hôm qua tôi đã viết đoạn mã sau (cố gắng nhớ một phần của nó từ trí nhớ của mình):
cấu trúc typedef {
iFrames int ngắn không dấu;
unsigned short int* iTime; // mảng có các phần tử [0..x] giữ thời gian cho mỗi khung hình
} Ngói;
Ngói* LoadTile(char* sFile)
{
// mong muốn khai báo đủ không gian cho một cấu trúc Ngói hoàn chỉnh, trong đó địa chỉ bộ nhớ cơ sở được lưu trong con trỏ tmpResult
Ngói* tmpResult = malloc(sizeof(Tile));
// thực hiện những việc đặt giá trị cho thực thể Tile
// ...
// trả về con trỏ để sử dụng tiếp
trả về tmpResult;
}
khoảng trống chính()
{
// xác định một con trỏ ô và đặt giá trị của nó thành con trỏ được trả về (điều này cũng nên được cho phép trong một hàng)
// Dự kiến sẽ nhận GIÁ TRỊ của con trỏ - tức là địa chỉ bộ nhớ cơ sở tại nơi malloc tạo không gian trống
Ngói* tmpTile;
tmpTile = LoadTile("tile1.dat");
// lấy/đặt các phần tử của ô
// ...
// giải phóng ô xếp
miễn phí(tmpTile);
}
Những gì tôi thấy: Tôi có thể sử dụng cấu trúc Ngói được sắp xếp bên trong hàm, nhưng ngay khi tôi cố gắng truy cập nó trong Main, tôi nhận được lỗi từ Visual Studio về vùng heap (nó cho tôi biết rằng có thứ gì đó đã được giải phóng sau khi cuộc gọi quay trở lại) .
Nếu tôi thay đổi nó để tôi sắp xếp khoảng trắng trong Main và chuyển một con trỏ tới khoảng trống đó dưới dạng tham số cho hàm LoadTile (để hàm không trả về bất cứ thứ gì nữa) thì nó sẽ hoạt động, nhưng tôi tin rằng tôi cũng có thể làm được điều đó. có chức năng LoadTile Phân bổ không gian và trả về một con trỏ tới không gian đó không? !
Cảm ơn!!
Không có gì sai với những gì bạn đang cố gắng thực hiện hoặc ít nhất không có gì sai với mã ở đây. Tuy nhiên, tôi lo lắng về dòng này:
unsigned short int* iTime; // mảng có các phần tử [0..x] giữ thời gian cho mỗi khung hình
Điều này không đúng trừ khi bạnMà cònPhân bổ iTime ở đâu đó:
Ngói* tmpResult = malloc(sizeof(Tile));
tmpResult->iTime = malloc(sizeof(short) * n);
Nó cần được giải phóng khi làm sạch:
miễn phí(tmpTile->iTime);
miễn phí(tmpTile);
Tôi là một lập trình viên xuất sắc, rất giỏi!