Tôi hơi mới đối với C và tôi đang gặp sự cố khi hiểu cách hoạt động của bộ nhớ, đặc biệt là các chức năng được tích hợp sẵn như memcpy
.C - Malloc và memcpy (quản lý bộ nhớ)
Dưới đây là một struct
Tôi đang sử dụng
struct data_t {
int datasize;
void *data;
};
Và đây là một chức năng phụ trợ mà tôi đang sử dụng nó với:
struct data_t *data_create(int size)
{
struct data_t *dt=malloc(sizeof(struct data_t)+size);
dt->datasize=size;
dt->data="1234567890a";
return dt;
}
Bây giờ trong main
chức năng tôi không có vấn đề làm điều này:
struct data_t *data = data_create(1024);
data->data="123456a";//just an example
Nhưng điều này sẽ ném ra lỗi Seg:
memcpy(data->data,"123456a",strlen("1234567890a")+1);
Câu hỏi của tôi là lý do tại sao? Và làm thế nào để tránh nó? Xin lưu ý rằng tôi là người mới đối với C, vì vậy cách thức giao dịch với bộ nhớ là một chút mới đối với tôi
Cảm ơn bạn.
Chỉnh sửa: Nó hoạt động! Cảm ơn nhiều. Hoàn toàn bị mất con trỏ dữ liệu. Bây giờ mọi thứ đều hoạt động tốt theo valgrind.
Space đã được phân bổ trong việc phân bổ ban đầu; con trỏ chỉ đơn giản là không được thiết lập để trỏ đến không gian được phân bổ. –
@JonathanLeffler: vâng, người hỏi đã phân bổ một số khoảng trống bổ sung khi ban đầu phân bổ, anh ta nên đã khởi tạo cho vấn đề. Tôi vẫn sẽ thích cuộc gọi rõ ràng hơn, nếu không có nhu cầu cụ thể để phân bổ tất cả cùng một lúc. – phoxis
điều này sẽ đưa ra lỗi: "chuyển đổi không hợp lệ từ‘ void * ’thành‘ data_t * ’[-fpermissive]" để giải quyết "bạn phải rõ ràng truyền con trỏ được trả về bởi malloc". – VasaraBharat