Проблема инициализации структуры? - PullRequest
3 голосов
/ 15 июля 2009

Я использую такую ​​структуру:

define struct _Fragment{
     int a;
     char *seq;
}Fragment;

Я хочу инициализировать структуру и с помощью метода malloc () вернуть динамическую память, подобную этой

Fragment *frag=malloc(10*sizeof(Fragment));

Тогда я бы использовал указатель фрагмента следующим образом:

frag->seq="01001";

Тогда проблема возникает, когда я возвращаю много фрагментов. в сообщении об ошибке говорится, что (с помощью инструмента valgrind):

Uninitialised value was created by a heap allocation

кто может сказать мне, как я могу справиться с этим. спасибо!

Ответы [ 4 ]

6 голосов
/ 15 июля 2009

Я не уверен, что у вас есть реальная проблема здесь, но для правильного этикета ваше распределение будет:

Fragment *frag=malloc(10*sizeof(Fragment));
if (frag) memset(frag,0,10*sizeof(Fragment));
4 голосов
/ 15 июля 2009

Проблема в том, что даже если вы используете malloc для выделения памяти для структуры фрагмента, вы не инициализировали ни одно из значений. Память, возвращаемая malloc, не гарантируется как какое-либо конкретное значение, поэтому вы должны явно инициализировать элементы структуры

Fragment* frag = malloc(10*sizeof(Fragment));
int i = 0;
for ( i = 0; i < 10; i++ ) { 
  frag[i].a = 0;
  frag[i].seq = NULL;
}

Если вам нужна гарантированная инициализированная память, вы должны использовать calloc. Он имеет дополнительную стоимость обнуления памяти, но может не иметь значения для вашего приложения.

Также вы должны проверить, что malloc действительно успешен:)

2 голосов
/ 15 июля 2009

Проблема в том, что malloc не инициализирует память, которую она выделяет. Valgrind уделяет особое внимание отслеживанию областей памяти, которые не были инициализированы.

Возможно, вам следует обратить внимание на ошибку, единственная причина, по которой Valgrind (при условии, что все работает правильно) должен печатать эту ошибку, потому что вы пытались где-то использовать неинициализированные данные, что, вероятно, непреднамеренно. Однако использование унифицированных переменных не входит в код, который у вас есть в вашем вопросе.

0 голосов
/ 15 июля 2009

Ваш код выглядит правдоподобно, но в следующей строке:

Fragment *frag=malloc(10*sizeof(Fragment));

Вы уверены, что вам нужно 10*?

Если вам нужно выделить 10 фрагментов, вы должны взять на себя ответственность за инициализацию всех 10.

...