2017-02-20 6 views
-1

Я немного новичок в структурах на C, и у меня возникла проблема с созданием массива для их хранения. Как говорится в заголовке, когда я пытаюсь выстроить массив структур, мой массив заканчивается слишком маленьким с большим размахом.mallocing массив структур создает слишком малый массив

Вот моя структура:

struct Points 
{ 
    char file_letter; 
    char *operation; 
    int cycle_time; 
}; 

А вот как я пытаюсь создать массив:

struct Points *meta_data; 
meta_data = malloc(number_of_delims * sizeof(struct Points)); 

number_of_delims является INT, представляющий число точек Пытаюсь создайте и, следовательно, количество элементов в моем массиве.

С number_of_delims быть 64 я получаю размер массива около 8.

Примечания: это более или менее проект для школы, и я не могу использовать ЬурейиЙ при объявлении моей как-структуры проф. хочет, чтобы каждая структура была явно объявлена ​​как каждый раз при ее использовании. На самом деле это может быть источником моей проблемы, но мы увидим!

+1

'С number_of_delims, являющимся 64, я получаю размер массива около 8.' Откуда вы это знаете? – tkausl

+1

Как вы знаете, размер массива составляет около 8? – immibis

+1

'sizeof (meta_data)' может быть 8 ... но это будет размер указателя, а не размер массива. – Dmitri

ответ

2
struct Points *meta_data; 

На данный момент мы имеем декларацию объекта, meta_data который имеет тип struct Points * ... и struct Points *, будучи указательного типа, как правило, требует 8 байт на общих реализаций. Это наблюдается по следующей программе:

#include <stdio.h> 
struct Points; 
int main(void) { 
    struct Points *meta_data; 
    printf("sizeof meta_data: %zu\n", sizeof meta_data); 
} 

Помните, что оператор sizeof оценивает размер типа выражения, которое в данном случае является указателем. Указатели не содержат информацию о размерах массивов, на которые они указывают. Вы должны сохранить это (то есть, предпочтительно, путем соединения number_of_delims с meta_data, если вам потребуются оба значения позже).


С number_of_delims быть 64 я получаю размер массива около 8.

No. Вы получаете размер массива из точно 64, как вы ожидали. Ваш указатель не будет автоматически переносить информацию об этом размере (потому что вы ожидаете этого), поэтому нет никакого переносного способа прийти к выводу, что ваше распределение может хранить только 8 элементов. Единственный способ прийти к такому выводу - ошибочно (т. Е. При попытке использовать sizeof, который, как я объяснил, не работает так, как вы ожидаете).


В качестве упражнения, что произойдет, если объявить указатель на массив из 64 struct Points, как так?

struct Points (*foo)[64] = NULL; 

Для начала, сколько элементов может содержать NULL? Что такое sizeof foo и sizeof *foo? Вы видите, что я имею в виду, когда я говорю sizeof оценивает размер типа выражения?

+0

. Я думаю, что я понимаю проблему, связанную с неправильным использованием размера для оценки размера моего массива. Я думаю, что моя проблема может закончиться счастливым совпадением, так как заполнение моего массива итеративно segfaults на восьмой итерации. Я предполагаю, что мой вопрос заключается в том, действительно ли код, который я по крайней мере предоставил, выглядел правильно, и должен ли я искать свою проблему в другом месте? – AcuteAvocado

+0

@AcuteAvocado Вы должны попробовать прочитать [эту страницу часто задаваемых вопросов] (http://stackoverflow.com/help/mcve), среди прочих, перед тем, как вы разместите здесь еще раз ... Хорошие манеры, чтобы ознакомиться с требованиями сообщества прежде чем просить их о помощи и просто показать вам, как самостоятельно отлаживать эти проблемы. Постскриптум Вы слышали о valgrind? – Sebivor

+0

Я прошу прощения за нооббивность моего сообщения. Я уже давно застрял в этой программе, и я старался держать свои вопросы простыми и прямыми. Возможно, я отказался от какого-то этикета, хотя в этой попытке. Я ценю, что вы нашли время, чтобы помочь мне понять, что я делаю немного больше! Я не слышал о valgrind, хотя из быстрого поиска это похоже на отладчик? Я использую GDB в настоящее время, но это привело меня к некоторым тупикам от того, что я вижу. Может быть, второе мнение может стоить того. Извиняюсь снова за то, как я себя вел. – AcuteAvocado