Структуры C: проблема инициализации?Ошибки Valgrind - PullRequest
0 голосов
/ 19 апреля 2011

Кодирование на C:

typedef struct {
   char *string;
   int one;
   int two;
} Example;

... в другом месте:

Example *new = (Example *)malloc(sizeof(Example*));
new->string = strdup(otherstring); //no problem here
new->one = 5; //valgrind says that there is an invalid write of size 4.

Моя программа работает нормально, я просто не могу сделать Вальгринда счастливым.И это, вероятно, означает, что у меня будет другая ошибка в другом месте.

Я думаю, мне не нужно объявлять указатель на структуру (то есть я мог бы вместо этого вызывать «Пример нового»), но яЗастрял в поиске, как распределить память в куче, потому что мне нужно будет получить доступ к «новым» из других частей программы.

Я делаю ошибку в нескольких вышеупомянутых строках?Или моя ошибка может быть где-то еще?Это первая ошибка памяти, о которой сообщает valgrind.

РЕДАКТИРОВАТЬ: случайно в моей структуре вместо int были s int вместо s int.Исправлено.

Ответы [ 3 ]

3 голосов
/ 19 апреля 2011

Я вижу здесь различные проблемы.Прежде всего, это:

Example *new = (Example *)malloc(sizeof(Example*));

не выделяет нужное количество памяти (и вам не нужен приведение).Вы хотите это:

Example *new = malloc(sizeof(Example));

Затем вы говорите это:

new->one = 5;

, и это присваивает int int*;Это не очень хорошая идея, и Valgrind справедливо жалуется на это.Если ваш struct правильно объявлен, то вы хотите следующее:

new->one = malloc(sizeof(int)); /* The other malloc doesn't allocate this, you have to. */
*(new->one) = 5;

Я подозреваю (как вы говорите, что все работает), что вы действительно хотите объявить свой struct так:

typedef struct {
   char *string;
   int one;
   int *two;
} Example;

но недостаточно информации, чтобы быть уверенным.Тогда у вас, вероятно, все еще есть похожие проблемы с new->two.

0 голосов
/ 19 апреля 2011

Попробуйте вместо этого (просто вырезать, вставить и запустить):

Example *new = (Example *)malloc(sizeof(Example));  //This is the correct method as pointed out by Bob, otherwise you're allocating only enough space to fit a memory location vs the struct
new->string = strdup(otherstring);  //this is okay
new->one = (int*)malloc(sizeof(int));
*(new->one) = 5; //You want to assign the value 5 to the new->one memory location, not assign new->one pointer the value of 5!!!
0 голосов
/ 19 апреля 2011

Пример * new = (Пример ) malloc (sizeof (Пример ));

Должен быть:

Пример * new = (Пример *) malloc (sizeof)(Пример);

Вы должны выделить всю структуру, а не просто ссылку на нее. Иногда программа запускается только потому, что вам повезло.

...