Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλημέρα. Έχω μια ασκησούλα που θέλω να κάνω και σας περιγράφω τι περίπου σκοπέυω: Θέλω να δημιουργήσω κάτι περίπου σαν κατάλογο με ονόματα στα οποία αντιστοιχώ μια διευθνση και μια ηλικία. Θέλω να χειριστώ δυναμικά όλο το πρόγραμμα και αυτά που έχω κάνει είναι τα εξής: για την ηλικια το πρόβλημα λύνεται έυκολα με έναν int pointer στον οποίο δεσμέυω δυναμικά μνήμη ανά 5 ονόματα. Το πρόβλημα μου είναι στα ονόματα και τις διευθύνσεις. Σας παραθέτω τον κώδικα πρώτα 

main()
{
	int *age,p=0;
	char *names,*address,onoma[20],die[20];
	age=(int*)malloc(5*sizeof(int));
	names=(char*)malloc(20);
	do
	{
		if (p%5==0 && p!=0)
		{
			realloc(age,5*sizeof(int));
			if (age!=NULL)
			      printf("\nMore memory assigned!\n\n");
		}
		printf("Give me the %d number: \n",p+1);
		scanf("%d",&age[p]);
		printf("Give me the %d name:\n",p+1);
		gets(onoma);
		names[p]=malloc((strlen(onoma)+1));
		strcpy(names[p],onoma);
		p++;
	}
	while (age[p-1]!=0);
	printf("BYE\n");
	free(age);
	system("pause");
		
}

 

Το πρόβλημα το έχω στην δήλωση των δυναμικών πινάκων για τα ονόματα και τις διευθύνσεις. Ουσιαστικα αυτές έχουν ως στοιχεία άλλες διευθύνσεις(συμβολοσειρές) και θέλω να τους αυξάνω κάθε φορά ανα πέντε ονόματα. Επίσης δεσμεύω δυναμικά όσο χώρο χρειάζονται ακριβώς το κάθε όνομα. 

Ευχαριστώ για οποιαδήποτε βοήθεια!

Δημοσ.
struct typos
{
	char *a;
}
struct typos *names;
names=malloc(20);

 

Πάλι υπάρχει πρόβλημα... στην malloc τι type-casting θα κάνω???? Ουσιαστικα θέλω εναν δυναμικό πίνακα που περιέχει δείκτες.... Μήπως δεν είναι εφικτό κάτι τέτοιο??

Δημοσ.

struct mitsos {
    char name[50];
    char addr[150];
    int age;
};

struct mitsos *katalogos;

katalogos = malloc (200 * sizeof struct mitsos);
Κατάλογος με 200 ονόματα. Αλλάζεις τα νούμερα σε τι μεγέθη θέλεις.

 

Η malloc επιστρέφει δείκτη σε void οπότε δεν χρειάζεται casting.

Δημοσ.

Καλησπέρα,

 

άσχετο με την αρχική σου ερώτηση, αλλά καλό είναι να ελέγχεις πιθανή αποτυχία της realloc και να το κάνεις assign στον age μονάχα αν πετύχει η realloc. Αλλιώς δημιουργείς από memory leaks έως crashes. Επίσης, καλό είναι να χρησιμοποιείς την fgets() αντί της καταργημένης gets() η οποία σε αφήνει ανυπεράσπιστο στο bad input.

  • Like 1
Δημοσ.

Γιατί δεν κάνεις τα names και address pointer σε pointer;

...
char **names, **address;
...

names = (char**)malloc(20);
...
// μέσα στο loop
names[p] = (char*)malloc((strlen(onoma)+1));
...

Και αντίστοιχα για το address...

Δημοσ.

Σε ευχαριστώ πολύ για τις συμβουλές σου :) Το αρχικό μου πρόβλημα όμως παραμένει.. 

 

Παρακαλώ!

 

Γιατί όμως παραμένει το αρχικό σου πρόβλημα; Η λύση που σου πρότεινε ο imitheos δεν σε βόλεψε; Αν όχι, οι εναλλακτικές είναι περισσότερο πολύπλοκες. Ιδιαίτερα εκείνη που σου πρότεινε ο bird, είναι αυτό που κατάλαβα κι εγώ διαβάζοντας το αρχικό σου μήνυμα, όταν έγραφες πως θέλεις να διαχειρίζεσαι τα πάντα δυναμικά.

 

Μετά όμως στον κώδικα που έδωσες όριζες π.χ. το onoma στατικά ως πίνακα 19+1 χαρακτήρων. Οπότε, αν πρόκειται να τα ορίζεις στατικά τα strings σου, τότε η υλοποίηση με έναν δυναμικό πίνακα από struct είναι η πιο βατή.

Δημοσ.

Ενταξει το έλυσα ΕΠΙΤΕΛΟΥΣ με τον τρόπο του ημίθεου.. Τα έκανα με struct που ουσιαστικά είναι δείκτης σε δείκτη με πιο κομψό τρόπο! Ευχαριστώ πολύ για την βοήθεια!! 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...