저는 C에서 약간 익숙하며 메모리가 작동하는 방식을 이해하는 데 어려움을 겪고 있습니다. 특히 memcpy
과 같은 내장 함수가 좋습니다. 여기 C - Malloc 및 memcpy (메모리 관리)
struct data_t {
int datasize;
void *data;
};
사용 해요 struct
입니다 그리고 여기에 내가 그것을 사용하고 보조 기능입니다 :
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;
}
는 이제
main
기능에 내가이 일을 아무 문제가 :
struct data_t *data = data_create(1024);
data->data="123456a";//just an example
그러나 이것은 Seg 결함을 던집니다.
memcpy(data->data,"123456a",strlen("1234567890a")+1);
내 질문은 왜입니까? 어떻게 피할 수 있습니까? C를 처음 접했을 때 C가 메모리를 어떻게 다룰 때 조금 새로운가요?
고맙습니다.
편집 : 작동합니다! 고맙습니다. 데이터 포인터를 완전히 놓쳤습니다. 이제 valgrind에 따르면 모든 것이 잘 작동합니다.
공간은 초기 할당에 할당 된; 포인터는 단순히 할당 된 공간을 가리 키도록 설정되지 않았습니다. –
@JonathanLeffler : 예, 처음에 할당 할 때 묻는 사람이 약간의 공간을 할당했습니다. 한 번에 모두 할당 할 필요가 없다면 나는 명시 적 호출을 선호 할 것이다. – phoxis
이렇게하면 "malloc에서 반환 한 포인터를 명시 적으로 캐스팅해야 함"을 해결하기 위해 ''void * '에서'data_t * '[-fpermissive]'로의 잘못된 변환이 발생합니다. – VasaraBharat