A
B
C
Ç
D
E
F
G
Ğ
H
I
İ
J
K
L
M
N
O
P
R
S
Ş
T
U
Ü
V
Y
Z
Q
W
X
+ İçerik Ekle
C, Dilinde, Struct, Yapısı
C Dilinde Struct Yapısı

C Dilinde Struct Yapısı C dilinde struct anahtar kelimesi ile programcı kendi değişken tiplerini yaratabilir.

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

struct sporcu {
        char * isim;
        struct boy_fr * boy;
        struct agirlik_fr * agirlik;
};

struct boy_fr {
        int metre;
        int santim;
};

struct agirlik_fr{
        int kilo;
};

main(){
        struct sporcu S;
        S.isim="Hakan Sukur";
        S.boy->metre=1;



        S.boy->sec=92;

        printf("%s %d m %d cm\n", S.isim,S.boy->metre, S.boy->santim);

        return 0;
}

Yukarıdaki program hatasız olarak derlenebilir. Ancak, çalıştırıldığında  “Segmentation Fault” hatası verecektir. Program şu şekilde düzeltilmelidir.

main(){
        struct sporcu S;
        S.isim=(char *)malloc(strlen("Hakan Sukur")+1);
        S.isim="Hakan Sukur";
        S.boy = (struct boy_fr *)malloc(sizeof(struct boy_fr));
        S.boy->metre=1;
        S.boy->santim=92;

        printf("%s %d m %d cm\n",S.isim,S.boy->metre,S.boy->santim);

        return 0;
}

Dinamik Bellek Yönetimi

C dilinde dinamik bellek yönetimi için malloc ve calloc komutları kullanılmaktadır.

void *malloc(size_t size);
void *calloc(size_t num, size_t size );

Kullanıcının boyutlarını belirlediği iki matrisin çarpımını yapan bir program hazırlanacaktır. Matris boyutlarının kullanıcıdan alınacak olması, ilgili değişkenlerin dinamik olarak yaratılmasını gerektirir.

Programın ikinci aşaması ise iki matrisin çarpımının nasıl yapıldığı ile ilgilidir.





İstenilen işlemi gerçekleştiren program aşağıda verilmiştir.

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

main(){
        int a_x, a_y, b_x, b_y,i,j,k;
        int** a, **b,**c;

        srand(time(NULL));

        printf ("Lutfen 1. matrisin boyutunu giriniz NxM");
        scanf("%d %d",&a_x,& a_y);

        printf ("Lutfen 2. matrisin boyutunu giriniz PxR");
        scanf("%d %d",&b_x,& b_y);

        if (a_y!=b_x){
                printf("boyutlar uygun degil\n");
                exit(-1);
        }

        a =(int**)malloc(a_x*sizeof(int*));
        for (i=0;i< a_x;i++)
                a[i]=(int *)malloc(a_y *sizeof(int));

        b =(int**)malloc(b_x*sizeof(int*));
        for (i=0;i<b_x;i++)
                b[i]=(int *)malloc(b_y *sizeof(int));


        c =(int**)malloc(a_x*sizeof(int*));
        for (i=0;i<a_x;i++)
                c[i]=(int *)calloc(b_y,sizeof(int));

        for (i=0;i<a_x;i++)
                for (j=0;j<a_y;j++)
                        a[i][j]=rand()%10;

        for (i=0;i<b_x;i++)
                for (j=0;j<b_y;j++)
                        b[i][j]=rand()%10;

        for (i=0;i< a_x;i++)
                for(j=0;j<b_y;j++)
                        for(k=1;k<a_y;k++)
                                c[i][j]+=a[i][k]*b[k][j];



        for (i=0;i< a_x;i++,printf("\n"))
                for (j=0;j<a_y;j++)
                        printf("%d ",a[i][j]);


        printf("\n\n\n");

        for (i=0;i<b_x;i++,printf("\n"))
                for (j=0;j<b_y;j++)
                        printf("%d ",b[i][j]);

        printf("\n\n\n");

        for (i=0;i<a_x;i++,printf("\n"))
                for (j=0;j<b_y;j++)
                        printf("%d ",c[i][j]);

        return 0;
}

Burada dikkat edilmesi gereken nokta, malloc/calloc fonksiyonu ile bir değerin döndürülüyor olmasıdır.





brush