структура calloc в C

#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;
}