Я пытаюсь создать срез указателей вручную и с помощью C.calloc () для выделения части массива среза. Я могу сделать это успешно, хотя, когда я пытаюсь добавить указатели, которые я выделяю с помощью make (), некоторые значения (на которые указывают указатели) изменяются, по-видимому, случайным образом. С другой стороны, если у меня C.calloc () место для указателей, которые я буду добавлять, значение не изменится. Или, если я выделяю срезы с помощью make (), а добавленные мной указатели выделяются с помощью make (), значения не изменяются.
Я замечаю, что места памяти указателей при использовании C.calloc () vs make () очень разные, но я не понимаю, почему это должно вызывать случайное изменение памяти. Я новичок в Go, поэтому, пожалуйста, прости меня, если я пропускаю некоторые очень простые.
Вот код, который я использую для распределения своих фрагментов вручную:
type caster struct {
ptr *byte;
len int64;
cap int64;
}
var temp caster;
temp.ptr=(*byte)(C.calloc(C.ulong(size),8));
temp.len=int64(size);
temp.cap=int64(size);
newTable.table=*(*[]*entry)(unsafe.Pointer(&temp));
Это работает, если записи, которые яadd распределяются следующим образом:
var temp caster;
var e []entry;
temp.ptr=(*byte)(C.calloc(C.ulong(ninserts),8));
temp.len=int64(ninserts);
temp.cap=int64(ninserts);
e=*(*[]entry)(unsafe.Pointer(&temp));
for i:=0;i<ninserts;i++ {
e[i].val=hint64(rand.Int63());
}
for i:=0;i<ninserts;i++ {
ht.insert(&e[i]);
}
, хотя память записей изменяется случайным образом, если они распределяются следующим образом:
var e []entry = make([]entry, ninserts);
for i:=0;i<ninserts;i++ {
e[i].val=hint64(rand.Int63());
}
for i:=0;i<ninserts;i++ {
ht.insert(&e[i]);
}
Если я обычно не строю свои фрагменты следующим образом:
newTable.table = make([]*entry, size);