2016-02-09 3 views
0

Я пытаюсь увеличить значение struct (int) только для проверки моего фрагмента кода (это не весь мой код), просто точка фокуса моего вопроса. Я дал:-структуруУвеличивающий член struct segfaults

typedef struct Test Test; 
typedef struct Test { 
    char * name; 
    int numOfElements; 
    Test * test[]; 
}Test; 

Как также функции:

void startFunc(Test ** newStruct) { 

    newStruct = malloc(sizeof(Test)); 

    (*newStruct)->name = NULL; 
    (*newStruct)->numOfElements = 0; 

    func(newStruct); 

} 

void func(Test ** newStruct) { 

    (*newStruct)->numOfElements++; 

} 

//create function to later free allocated memory 

Однако увеличивающееся значение numOfElements кажется сегментация. Это тот факт, что я не выделить достаточно памятей (Так как я использую гибкий элемент массива?)

Я попытался с помощью Valgrind и получил недопустимое чтение размера 8 на (*newStruct)->name =NULL;

Что бы предложить это не malloced, помощь памяти здесь будет очень признательна,

+0

Так что я должен таНос как двойной указатель и указатель одного? У меня есть функция (не показана здесь), которая получает аргумент с двойным указателем, поэтому я не был так уверен. – KLIK

+0

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

ответ

2

malloc(sizeof(Test)) предназначен для выделения необработанного объекта типа Test, поэтому концептуально он возвращает указатель Test *. Этот указатель присваивается newStruct, который является Test **. Это несоответствие между Test * и Test ** уже предполагает, что линия malloc сломана.

Непосредственным бы предположить, что это

newStruct = malloc(sizeof(Test)); 

был на самом деле предназначены для

*newStruct = malloc(sizeof(Test)); 

Вы уже скрупулезно используя *newStruct везде в вашем startFunc, но по какой-то причине, совершенно забыв об этом в линия malloc.

возможно лучший способ выразить то же самое было бы

*newStruct = malloc(sizeof **newStruct); 
+0

И в качестве стиля я всегда представляю один-указатель для локального использования и назначаю двойную указатель перед возвратом. Это помогает избежать путающих вопросов, подобных этому. –

Смежные вопросы