#objective-c #c #memory #struct
#objective-c #c #память #структура
Вопрос:
Я пытаюсь инициализировать указатель на структуру со значениями 0.0 в ней. Посмотрите на следующую ситуацию:
typedef struct
{
float a;
float b;
float c;
} structA;
structA *ptr = calloc(100000, sizeof(structA));
Я хочу, чтобы все значения в * ptr были StructA с начальными значениями {0.0, 0.0, 0.0}, но этого у меня сейчас нет. Многие индексы * ptr отображаются правильно, но некоторые индексы отображаются со странными значениями (например, {0.0, 0.0, 10241256124.0}).
Если я попробую malloc, произойдет то же самое.
Что я должен делать?
Комментарии:
1. Вы проверили возвращаемое значение
calloc
, чтобы убедиться, что оно выполнено успешно? Выполняется ли какой-либо код в период между выделением памяти и проверкой ее содержимого? Насколько вы уверены, что вы не строчите в блоке?2. Как вы проверяете содержимое
ptr
, чтобы найти эти странные значения?3. Может быть, вы могли бы включить код для своего
printf
цикла вместо того, чтобы чрезмерно драматизировать свою пунктуацию. И вотcalloc
страница руководства ,calloc
устанавливающая все биты в выделенной памяти равными нулю. Вы могли бы проверять, что находится внутри,ptr
используя отладчик, поэтому вопрос, откуда вы знаете, чтоptr
что-то перепутано, является вполне допустимым вопросом.4. Вы должны быть в состоянии предоставить тривиальную минимальную программу, которая воспроизводит проблему.
5. Вы говорите, что при попытке
malloc()
происходит то же самое. Является ли соотношение обнуленных и ненулевых элементов примерно одинаковым? Может ли в вашей кодовой базе быть определение макроса, переопределяющее вызов функции дляcalloc()
скрытия где-либо?
Ответ №1:
Вы делаете что-то неправильно… Я никогда не использовал objective-c, поэтому я вставил приведенный ниже код в ideone.com и это сработало, как ожидалось… (распечатка выполнена, а не сбой, потому что) все значения были равны нулю. Я предполагаю, что вы не проверяете должным образом, поскольку маловероятно, что в вашем компиляторе есть ошибка…
#include <malloc.h>
typedef struct
{
float a;
float b;
float c;
} structA;
int main() {
int count = 100000;
int i;
structA *ptr = calloc(count, sizeof(structA));
if(ptr) {
for(i=0;i<count;i ) {
if(ptr[i].a || ptr[i].b || ptr[i].c) {
printf("failn");
}
}
printf("donen");
}
return 0;
}