2014-12-07 3 views
1

Я хочу создать массив void * 1d, каждый указатель в каждой ячейке указывает на структуру, которую я написал (он должен быть void * array, а не sturct array по некоторым причинам ), до сих пор я написал это:void * указывает на структуру?

typedef struct 
{ 
int weight; 
int amount; 

} Banana; 

void* makeBanana(){ 
Banana new; 
new.weight = 1; 
new.amount = 6; 

void* p = &new; //its Legal?? 
return p; 

Теперь, после того, я хочу, чтобы сохранить этот р в динамическом массиве недействительных * указателей, каждый из которых недействительными * указатель указывает на соседний банан, я написал:

void* ptrToBananaArray = (void*)malloc(3); //3 is just example of lenght 
ptr[0] = makeBanana(); 

это нормально, или нет? а если нет, то какой правильный способ?


Причины для использования void* вместо Banana*: его, потому что у меня есть общий код elswhere, которые получают только void* типов, поэтому здесь свой банан, но в будущем он будет хотеть, чтобы получить также помидоры или лук или что-то еще, поэтому он должен быть недействительным *

+4

NG. 'void * p = &new; return p;': 'p' указывает на локальную переменную. недействителен во внешнем масштабе. – BLUEPIXY

+0

makeBanana() должен возвращать указатель на пустоту, которая не имеет смысла. – Rob

+0

Если вы используете 'void *', ваш код будет сложнее писать и читать. По некоторым причинам вы указали «не стойкий массив» - каковы эти причины? Вы должны описать их, чтобы мы могли понять, важнее ли они иметь чистый код. – anatolyg

ответ

0

образец кода

#include <stdio.h> 
#include <stdlib.h> 

typedef struct 
{ 
int weight; 
int amount; 

} Banana; 

void *makeBanana(){ 
    Banana *new; 
    new = malloc(sizeof(Banana)); 
    if(new != NULL){ 
     new->weight = 1; 
     new->amount = 6; 
    } 
    return new; 
} 

int main(void){ 
    void ** ptr = (void**)malloc(3*sizeof(void*)); 
    ptr[0] = makeBanana(); 
    Banana *bananap = ptr[0]; 
    printf("weight: %d, amount: %d\n", bananap->weight, bananap->amount); 
    free(ptr[0]); 
    free(ptr); 
    return 0; 
} 
+1

Как этот код отличается от оригинального и почему вы сделали эти изменения? – anatolyg

+1

1) return heap area (by malloc) 2) 'void **' как массив 'void *' – BLUEPIXY

+1

Причина 1) до тех пор, пока не будет выпущено время жизни кучи. 2) 'void * ptrToBananaArray = (void *) malloc (3);' Mistake много смысла.1-й 'void' не равен' void * ' – BLUEPIXY

1

У вас есть опечатка.

Banan new; 

Если, вероятно, будет Banana new; Помимо этого существует фундаментальная проблема в функции makeBanana(). Вы не должны возвращать адрес локальной переменной, поскольку он недействителен, как только функция возвращается.

Вы должны выделить-структуру с таНос:

Banana* new = malloc(sizeof(*new)); 
new->weight = 1; 

и возвращает указатель:

return new ; 

Наконец, было бы здорово, чтобы изменить имя переменной, чтобы не путать читателей с new.

+0

да я просто изм. – user2637293

+0

после редактирования он должен скомпилировать: http://ideone.com/7qUSYs – 4pie0

+0

Я не видел большого смысла в публикации другого ответа, не стесняйтесь улучшаться. – 2501

2

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

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