LINUX.ORG.RU

Help with realloc() wanted.


0

0

Я пытаюсь создать динамическую структуру внутри которой есть другая динамическая структура. Я ловлю SIGSEGV в realloc();

Вот мой код. Что я делаю не так?

#include "string.h"
#include "stdlib.h"

typedef struct VAR
{
char *Key;
char *Type;
char *Value;
} VAR_T;

typedef struct ARR
{
VAR_T *v;
int Count;
} ARR_T;

int AddVar (ARR_T *V, char *type, char *key, char *value)
{
if (!strcmp(type,"int") ||
!strcmp(type,"char") ||
!strcmp(type,"float"))
{
V->v[V->Count].Value = (char*)realloc(V->v[V->Count].Value,sizeof(char));
strcpy(V->v[V->Count].Value,value);
V->Count++;
}
}


int main ()
{
ARR_T v;

v.Count = 0;

AddVar(&v,"int","a","1");
}


В realloc() указывает новый размер блока памяти, а не насколько его надо увеличивать

anonymous
()
Ответ на: комментарий от anonymous

Thx, понял,

но тогда все равно следующая строка в первый раз не должна давать SEGFAULT...

V->v[V->Count].Value = (char*)realloc(V->v[V->Count].Value, sizeof(char));

просто V->v[V->Count].Value увеличится на 1 и все... Но почему SEGFAULT вылазит?

DRuG
() автор топика
Ответ на: комментарий от fghj

Действительно... Пишу из дома по памяти... Подводит :-)

Поменял AddVar:

int AddVar (ARR_T *V, char *type, char *key, char *value) { if (!strcmp(type,"int") || !strcmp(type,"char") || !strcmp(type,"float")) { printf("%i\n",V->Count); V->v = (VAR_T*)realloc(V->v, (V->Count+1)*sizeof(VAR_T)); // V->v[V->Count].Value = (char*)realloc(V->v[V->Count].Value, strlen(value)*sizeof(char)); // strcpy(V->v[V->Count].Value,value); // V->Count++; } }

И снова SIGSEGV в realloc()

DRuG
() автор топика
Ответ на: комментарий от fghj

Действительно... Пишу из дома по памяти... Подводит :-)

Поменял AddVar:

int AddVar (ARR_T *V, char *type, char *key, char *value)
{
    if (!strcmp(type,"int") ||
	!strcmp(type,"char") ||
	!strcmp(type,"float"))
    {
	printf("%i\n",V->Count);
	V->v = (VAR_T*)realloc(V->v, (V->Count+1)*sizeof(VAR_T));
//	V->v[V->Count].Value = (char*)realloc(V->v[V->Count].Value, strlen(value)*sizeof(char));
//	strcpy(V->v[V->Count].Value,value);
//	V->Count++;
    }
}

И снова SIGSEGV в realloc()

DRuG
() автор топика
Ответ на: комментарий от DRuG

А почему на ничего? Компилятор ее видит и не ругается. Как мне тогда добавить новый елемент в "VAR_T *v;"?

DRuG
() автор топика
Ответ на: комментарий от DRuG

>V->v = (VAR_T*)realloc(V->v, (V->Count+1)*sizeof(VAR_T));

чтобы так работало, нужно чтобы V->v был равен NULL в самом начале,
в общем man realloc

fghj ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.