2016-04-04 12 views
1

Neden kodum kullanıcı verileri girdikten sonra çöp değişkenlerini yazdırıyor anlamıyorum. C Sınıfına girişimde Veri Yapıları, bağlantılı listeler ve bellek ayırma öğrenme sürecinde. Yardım için teşekkürler!Veri yapım için belleği bellekte nasıl ayırırım C

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

typedef struct AutoMobilesInfo 
{ 
    char *Manufacturer, *ModelNameOfCar, *ColorOfCar; 
    int YearOfCar; 
    struct AutoMobilesInfo *next; 
} Car; 

void EnterCarInfo(Car *Info) 
{ 
    Info = (Car *)malloc(sizeof(Car)); 
    Info->Manufacturer = (char *)malloc(12 *(sizeof(char))); 
    Info->ModelNameOfCar = (char *)malloc(12 *(sizeof(char))); 
    Info->ColorOfCar = (char *)malloc(12 *(sizeof(char))); 

    printf("Please enter the car's manufacturer: \n"); 
    scanf(" %s", Info->Manufacturer); 
    printf("Please enter the car's model: \n"); 
    scanf(" %s", Info->ModelNameOfCar); 
    printf("Please enter the car's color: \n"); 
    scanf(" %s", Info->ColorOfCar); 
    printf("Please enter the year the car was made: \n"); 
    scanf("%d", &Info->YearOfCar); 
} 

void PrintedOutCarInfo(Car *host) 
{ 
    host = (Car *)malloc(sizeof(Car)); 
    host->Manufacturer = (char *)malloc(12 *(sizeof(char))); 
    host->ModelNameOfCar = (char *)malloc(12 *(sizeof(char))); 
    host->ColorOfCar = (char *)malloc(12 *(sizeof(char))); 

    printf("The car's manufacturer is %s\n", host->Manufacturer); 
    printf("The car's model is %s\n", host->ModelNameOfCar); 
    printf("The color of the car is %s\n", host->ColorOfCar); 
    printf("The year the car was made is %d\n", host->YearOfCar); 
} 

int main() 
{ 
    Car *Car1; 
    Car1 = (Car *) malloc(sizeof(Car)); 
    EnterCarInfo(Car1); 
    PrintedOutCarInfo(Car1); 
    free(Car1); 

    return 0; 
} 

cevap

1

Sen PrintedOutCarInfo yılında işaretçi üzerine yazarak ediyoruz. Bu hat

host = (Car *)malloc(sizeof(Car)); 

ve bu hat

Info = (Car *)malloc(sizeof(Car)); 

değişkenler host ve Info tahsis edilir size geçti. konudur ... Bu yerine ...

Info = malloc(sizeof(Car)); 

bu deneyin yapmak Ayrıca Malloc yani dönüşleri harf olmamalıdır bu

void PrintedOutCarInfo(Car *host) { 
    printf("The car's manufacturer is %s\n", host->Manufacturer); 
    printf("The car's model is %s\n", host->ModelNameOfCar); 
    printf("The color of the car is %s\n", host->ColorOfCar); 
    printf("The year the car was made is %d\n", host->YearOfCar); 
} 

için

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

typedef struct AutoMobilesInfo 
{ 
    char *Manufacturer, *ModelNameOfCar, *ColorOfCar; 
    int YearOfCar; 
    struct AutoMobilesInfo *next; 
} Car; 

void EnterCarInfo(Car *Info) 
{ 
    Info->Manufacturer = malloc(12 * (sizeof(char))); 
    Info->ModelNameOfCar = malloc(12 * (sizeof(char))); 
    Info->ColorOfCar  = malloc(12 * (sizeof(char))); 

    printf("Please enter the car's manufacturer: \n"); 
    scanf(" %s", Info->Manufacturer); 
    printf("Please enter the car's model: \n"); 
    scanf(" %s", Info->ModelNameOfCar); 
    printf("Please enter the car's color: \n"); 
    scanf(" %s", Info->ColorOfCar); 
    printf("Please enter the year the car was made: \n"); 
    scanf("%d", &Info->YearOfCar); 
} 

void PrintedOutCarInfo(Car *host) { 
    printf("The car's manufacturer is %s\n", host->Manufacturer); 
    printf("The car's model is %s\n", host->ModelNameOfCar); 
    printf("The color of the car is %s\n", host->ColorOfCar); 
    printf("The year the car was made is %d\n", host->YearOfCar); 
} 

int main() 
{ 
    Car *Car1 = malloc(sizeof(Car)); 
    EnterCarInfo(Car1); 
    PrintedOutCarInfo(Car1); 
    free(Car1); 
    return 0; 
} 
+0

İlk soru, derleyici kodda: blokları malloc.h eklemediyseniz malloc işlevini anlayabilen bloklar nasıl? İkinci Soru, Neden önce veri yapmam için bellek ayırmam gerekiyordu? Girişte olduğu gibi, EnterCarInfo() işlevimde ilk satırı nasıl kaldırdığınızı görüyorum. – humbleCoder

+0

Malloc.h veya ihtiyacınız olup olmadığını bilmiyorum. Ben makinemde yok. Eğer onu tekrar eklerseniz. Zaten Car1 için hafızayı ana tahsis ettiniz. Bunu fonksiyonlara aktardınız. – Harry

+0

Oluşturur, derler ve çalışır, bu yüzden eminim. Bir sonraki ders saatimizde profesörüme sormam gerekecek. Tamam, şimdi anlıyorum ve yardımlarınız için teşekkür ederim! – humbleCoder

0

o fonksiyonu değiştirin PrintedOutCarInfo() içinde bellek ayırma nedeniyle oluşur. EnterCarInfo() uygulamasında, Araba ve üyeleri için gerekli olan belleği (dizeleri) ayırır ve bunları kullanıcının girdisiyle doldurursunuz. Araç yapısını ve üyelerini tekrar EnterCarInfo'ya ayırdığınızda, referanslarınızı orijinal Araba yapısına ve üyelerine iletiyorsunuz. EnterCarInfo() 'nın ilk 4 satırını kaldırırsanız, program çalışmalıdır. Bir yan not olarak, bu uygulama öğrenme/gösteri için Tamam, ancak boyut sınırlarını zorlamadan kullanıcı girişi alacak sabit bir bellek bloğu ayırmak iyi bir fikir değildir. Sınırları kontrol edememek, arabellek taşması saldırıları için sizi açacaktır. Bu yardımcı olur umarım.

+0

Bu sorun, veri yapımı dinamik olarak ayırmam ve bunu yapmak için ilk 4 satır koduna ihtiyacım var.Yanlış olmadığım ve dinamik olarak ayırmadığım başka bir şey ifade etmiyor Ben yapmıyorum. – humbleCoder

0

Harry'nin aşağıda belirttiği gibi, PrintedOutCarInfo()'da işaretçilerin üzerine yazıyorsunuz. uygulamanız tarafından kullanım için belirli bir bellek miktarını

void PrintedOutCarInfo(Car *host) 
{ 
    printf("The car's manufacturer is %s\n", host->Manufacturer); 
    printf("The car's model is %s\n", host->ModelNameOfCar); 
    printf("The color of the car is %s\n", host->ColorOfCar); 
    printf("The year the car was made is %d\n", host->YearOfCar); 
} 

Malloc() ayırır (rezerv) ve ardından bellek bu öbek başlar adrese bir işaretçi döndürür: Bu fonksiyon aşağıdaki gibi görünmelidir. Gerekli belleği önceden AdCarInfo() içine tahsis ettiniz, bu yüzden Maloc() öğesini ikinci bir kez PrintedOutCarInfo() içinde çağırdığınızda bellekte başka bir yer ayırıyorsunuz ve sonra AutoMobilesInfo'nun işaretçisini bellekteki yeni yere işaret ediyorsunuz. EnterCarInfo() tarafından toplanan veriler hala bellekte, ancak artık AutoMobilesInfo örneğiniz tarafından başvurulmayan eski konumunda. Böylece, verileri yazdırdığınızda(), yeni ayrılmış bellek yığınında ne çöp biriktirdiğini yazdırabilirsiniz.

+0

Evet, şimdi biraz daha açık bir şekilde anlıyorum.Ancakta da tahsis ettiğimin farkında değildim. – humbleCoder

İlgili konular