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

malloc/segmentation fault c++


dinak

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

Δημοσ.

έχω τον εξής κώδικα

>#include <iostream>
#include <string>

using namespace std;

struct student{
              string name;
              string surname;
              int age;
              int am;
              int grade1;
              int grade2;
              int avg;
              int average(int grd1, int grd2){
                                          int mo= (grd1+grd2)/2;
                                          return mo;
              }
              
              void show(int Aver, int AM){
                          cout << "AM: " << AM << "  Average: " << Aver << endl;
              }
};

main(){
      int i;
      struct student *Std;
      
      Std=(struct student *)malloc(3*sizeof(struct student));
      
      for(i=0;i<3;i++){
                      cout << "Onoma Foititi " << i << " : ";
                      cin >> (Std[i].name);
                      cout << "Epitheto Foititi " << i << " : ";
                      cin >> (Std[i].surname);
                      cout << "Ilikia Foititi " << i << " : ";
                      cin >> Std[i].age;
                      cout << "AM Foititi " << i << " : ";
                      cin >> Std[i].am;
                      cout << "Vathmos 1: ";
                      cin >> Std[i].grade1;
                      cout << "Vathmos 2: ";
                      cin >> Std[i].grade2;
      }

}

 

και σκάει όταν πάω να εισάγω το όνομα του φοιτητή στη δεύτερη επανάληψη!τι στο καλό φταίει;

Δημοσ.

Νομιζω οτι μεσα σε struct δε γινετε να εχεις συναρτηση (υλοποιημενη), και δευτερο οτι δε γινετε να χρησιμοποιησεις το string επειδη ειναι κλαση.

 

πχ αυτο τρεχει μια χαρα

>//#include <iostream>
//#include <string>
#include <stdio.h>
#include <stdlib.h>
//using namespace std;
#define string char*

struct student{
              string name;
              string surname;
              int age;
              int am;
              int grade1;
              int grade2;
              int avg;
		  /*
              int average(int grd1, int grd2){
                                          int mo= (grd1+grd2)/2;
                                          return mo;
              }
              
              void show(int Aver, int AM){
                          
              }
		   */
};

void main(){
      int i;
      struct student *Std;
      
      Std=(struct student *)malloc(3*sizeof(struct student));
      
      for(i=0;i<3;i++){
	   Std[i].name= malloc(100);
	   scanf("%s",Std[i].name);
                    
      }
   
   for(i--;i>-1;i--)
	   printf("%s\n",Std[i].name);
   system("pause");

}

Δημοσ.

Το struct είναι ίδιο με το class με public members (by default) αρα μπορείς να έχεις συναρτηση.

 

Το λάθος σου είναι ότι χρησιμοποίησες malloc που απλά δεσμεύει μνήμη ενω έχεις member string. Αυτό σημαινει οτι παρεκαμψες την κληση του constructor των string.

 

Αντι για malloc, κάνε Std = new student[3];

 

και στο τέλος

 

delete []student;

Δημοσ.

Μολις ειδα οτι αναφερετε σε C++ και οχι C... Λεω και γω... string σε C παραξενευτηκα :rolleyes: ..

Αυτο δεν ειναι C syntax "sizeof(struct student)" ?

 

WOW Αυτο δεν το ηξερα!! Καλη φαση.

 

>#include "stdafx.h"
#include <typeinfo>
class __S{
public:
__S()
{
	printf("ctr __S\n");
}
};
class Object
public:
__S s;
Object()
{
	printf("ctr Object\n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Object *o  = new Object();

getchar();
return 0;
}

 

 

Δημοσ.

το sizeof+malloc δεν ταιριάζουν στη c++.

(π.χ. αναμένονται προβλήματα με virtual members, κλήση constructor/destructors, κτλ)

 

επιπλέον δεν συνήστατε η αναγνωση string(c++) με scanf© η οποια γεμίζει char arrays.

Βέβαια η scanf/printf ΕΧΟΥΝ και στη C++ χρησιμοτητες...

 

ΥΓ. βέβαια τους destructors μπορουμε να τους καλέσουμε με το ζόρι αν θέλουμε (και τους έχουμε δημιουργήσει)

π.χ. this->student::~student();

Δημοσ.
cs.uoi ftw :)

 

έτσι :-D τρέχουμε και δεν φτάνουμε :-(

 

Το struct είναι ίδιο με το class με public members (by default) αρα μπορείς να έχεις συναρτηση.

 

Το λάθος σου είναι ότι χρησιμοποίησες malloc που απλά δεσμεύει μνήμη ενω έχεις member string. Αυτό σημαινει οτι παρεκαμψες την κληση του constructor των string.

 

Αντι για malloc, κάνε Std = new student[3];

 

και στο τέλος

 

delete []student;

 

ευχαριστώ πολύ για τη βοήθεια...όντως αυτό ήταν!

Δημοσ.

αυτή η δυναμική κατανομή μνήμης τελικά δε με θέλει :P

 

άσκηση λιστών σε C αυτή τη φορά...

 

>#include <stdio.h>


typedef struct arrays{
                     int **Array;
                     int row_num;
                     int column_num;
                     int key;
                     int table_count;
}DBTable;

typedef struct table_list{
                         DBTable *table;
                         struct table_list *next;
}TableNode;                 

TableNode *db_ptr=NULL;


int new_table(){
               
               int rows, columns, c_key, i, j, **A;
               TableNode *TN;
               DBTable *DBT;
               
               
               printf("Eisagete to plithos twn grammwn tou pinaka: ");
               scanf("%d", &rows);
               printf("Eisagete to plithos twn stilwn tou pinaka: ");
               scanf("%d", &columns);
           
               
               A=(int **)malloc(rows*sizeof(int *));
               												
               
               for(i=0;i<rows;i++){
                                   A[i]=(int *)malloc(columns*sizeof(int));
                                                                           
               }
                                   
               for(i=0;i<rows;i++){
                                   for(j=0;j<columns;j++){
                                                          printf("Eisagete to (%d,%d) stoixeio tou pinaka: ", i, j);
                                                          scanf("%d", &A[i][j]);
                                   }
               }
               
             
               
               printf("Eisagete enan arithmo apo to 0 ews to %d gia tin stili-kleidi: ", columns-1);
               scanf("%d", &c_key);
               
               for(i=0;i<(rows-1);i++){
                                   for(j=i+1;j<rows;j++){
                                                         if(A[i][c_key]==A[j][c_key]){
                                                                                      printf("I stili kleidi periexei idious arithmous\n");
                                                                                      return (-1);
                                                         }
                                   }
               }
                                                                
               
               TN=(TableNode *)malloc(sizeof(TableNode));
               DBT=(DBTable *)malloc(sizeof(DBTable));
               TN->table->Array=(int **)malloc(rows*sizeof(int *));
             	
             	for(i=0;i<rows;i++)
             	                   TN->table->Array[i]=(int *)malloc(columns*sizeof(int));
			

             	
				              	 
				
               TN->table->row_num=rows;             
               TN->table->column_num=columns;
               TN->table->key=c_key;
               
                               
               
               
               
               for(i=0;i<rows;i++){
                                   for(j=0;j<columns;j++){
                                                          TN->table->Array[i][j]=A[i][j];
                                                          printf("%d\n", TN->table->Array[i][j]);  
                                                          					                
                                   }
               }                       
               
               TN->next=db_ptr;
               db_ptr=TN;			
               
                                                              
               (TN->table->table_count)++;
               return (TN->table->table_count);
               
}


main(){
      int k;
      
      k=new_table();
    
      printf("%d\n", k);
//και εδώ ακριβώς σκάει
      
      system("pause");
      }

 

καμιά βοήθεια;

Δημοσ.

κάνε το έτσι

 

>
               TN=(TableNode *)malloc(sizeof(TableNode));
               DBT=(DBTable *)malloc(sizeof(DBTable));
               [color="Red"]TN->table=(DBTable *)malloc(sizeof(DBTable));[/color]
               TN->table->Array=(int **)malloc(rows*sizeof(int *));

Δημοσ.

oh απάντησε ο άλλος

 

edit: μιας και έπιασα χώρο για πόστ, θα σου συνήστουσα να αρχίσεις να χρησημοποιείς debugger μιας και η εκτίμηση σου για το που ήταν το πρόβλημα ήταν λίγο off...

Δημοσ.
oh απάντησε ο άλλος

 

edit: μιας και έπιασα χώρο για πόστ, θα σου συνήστουσα να αρχίσεις να χρησημοποιείς debugger μιας και η εκτίμηση σου για το που ήταν το πρόβλημα ήταν λίγο off...

+1

 

Πχ δες το παρακατω

post-103086-129063035015_thumb.jpg

 

Στο visual studio η διευθυνση 0xcdcdcdcd μας λεει οτι δεν ειναι "initialised" (δεν ξερω την ελληνικη ορολογια)

Δημοσ.
oh απάντησε ο άλλος

 

edit: μιας και έπιασα χώρο για πόστ, θα σου συνήστουσα να αρχίσεις να χρησημοποιείς debugger μιας και η εκτίμηση σου για το που ήταν το πρόβλημα ήταν λίγο off...

 

+1

 

επίσης όταν έχεις να κάνεις με δείκτες που είναι εύκολο να αντιμετωπίσεις τέτοια

κρασαρίσματα μπορείς να βάζεις εντολές

 

printf("\n(1)mexri edo ok!!!");

.............

printf("\n(2)mexri edo ok!!!");

 

 

οπότε η εντολή που ευθύνεται για το κρασάρισμα θα είναι μετά την printf

που εμφανίζεται στην οθόνη

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...