01. malloc() 함수를 사용하여 int 변수, short 변수, float 변수를 저장할 수 있는 동적 메모리를 만들고 사용자로부터 해당 값을 입력받아서 저장한다. 동적 메모리에 저장된 값을 꺼내서 출력한다.

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

int main() {
	int* a = (int*)malloc(sizeof(int));
	short* b = (short*)malloc(sizeof(short));
	float* c = (float*)malloc(sizeof(float));

	printf("정수(int형)을 입력하시오: ");
	scanf("%d", a);
	printf("정수(short형)을 입력하시오: ");
	scanf("%d", b);
	printf("실수(float형)을 입력하시오: ");
	scanf("%f", c);

	printf("\n입력된 값은 %d, %d, %.2f입니다.", *a, *b, *c);
    free(a);
    free(b);
    free(c);
}

02. 사용자가 입력한 n개의 실수의 합을 계산하기 위한 C 프로그램을 작성해보자. 사용자로부터 실수의 개수를 먼저 입력받도록 해보자. 실수의 개수만큼 동적 메모리를 할당하고, 실수들을 동적 메모리에 저장한다.

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

int main() {
	int a;
	double sum = 0;
	double* p;
	printf("실수의 개수: ");
	scanf("%d", &a);
	p = (double*)malloc(sizeof(double) * a);
	for (int i = 0; i < a; i++) {
		printf("실수를 입력하시오: ");
		scanf("%lf", p + i);
	}

	for (int i = 0; i < a; i++) {
		sum += p[i];
	}
	printf("합은 %.1lf입니다. ", sum);
    free(p)

}

03. 정수 100개를 저장할 수 있는 동적 메모리를 할당받고 여기에 0부터 99 사이의 난수를 저장한다. 난수 중에서 최대값을 찾아서 출력해보자.

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

#define size 100

int main() {
	srand((unsigned)time(NULL));
	int* a = (int*)malloc(sizeof(int) * size);
	int max;

	for (int i = 0; i < size; i++) {
		a[i] = rand() % 100;
	}

	max = a[0];
	for (int i = 1; i < size; i++) {
		if ( max < a[i]) {
			max = a[i];
		}
	}
	printf("난수 중에서 최대 값은 %d입니다.", max);
    free(a)
}

04. malloc()함수를 사용하여 문자열을 저장할 수 있는 동적 메모리를 생성하고 사용자가 입력한 문자열을 저장한 후에 화면에 출력한다. 문자열을 입력받기 전에 문자열의 최대 길이를 먼저 입력받는다.

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

int main() {
	char* p = NULL;
	int len;
	printf("문자열의 최대 길이를 입력하시오: ");
	scanf("%d", &len);
	getchar();
	p = (char*)malloc(sizeof(char) * (len+1));
	printf("문자열을 입력하시오: ");
	gets_s(p, sizeof(char) * (len + 1));
	printf("\n입력된 문자열은 %s입니다.", p);
    free(p);
}

05. 처음에 20바이트를 동적 할당받아서 "hangookuniv"를 저장한다. realloc()를 이용하여 동적 할당 메모리의 크기를 30바이트로 증가시키고, 이미 있던 문자열에 ".com"을 추가해보자. 저장된 문자열과 동적 할당 메모리의 주소를 출력해보자.

 

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

int main() {
	char* p = (char*)malloc(sizeof(char) * 20);
	strcpy(p, "hangookuniv");
	printf("문자열 = %s, 주소 = %u \n", p, p);
	p = (char*)realloc(p, sizeof(char) * 30);
	strcat(p, ".com");
	printf("문자열 = %s, 주소 = %u \n", p, p);
    free(p)
}

06. 다음과 같은 구조체를 동적 메모리 할당으로  생성하는 프로그램을 작성해보자. 동적으로 생성된 구조체에는 { 10, 3.14, 'a'}를 저장한다.

typedef struct rec {
	int i;
    float PI;
    char A;
} my_record;

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

typedef struct rec {
    int i;
    float PI;
    char A;
} my_record;

int main() {
    my_record* p = (my_record*) malloc(sizeof(my_record));
    *p = { 10,3.14,'a' };
    printf("i = %d \n", (*p).i);
    printf("PI = %.2f \n", p->PI);
    printf("A = %c \n", p->A);

}

07. 성적을 나타내는 구조체가 다음과 같다. 사용자에게 구조체의 개수를 입력하도록 요청하고 개수만큼의 동적 메모리를 할당받은 후에 구조체에 값을 저장한다. 입력이 끝나면 구조체에 저장된 값을 화면에 출력한다. 

struct course {
	char subject[30];
    double marks;
};

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

struct course {
    char subject[30];
    double marks;
};

int main() {
    int len;
    struct course* p;
    printf("구조체의 개수: ");
    scanf("%d", &len);
    p = (struct course*)malloc(sizeof(struct course) * len);
    for (int i = 0; i < len; i++) {
        printf("과목 이름과 성적: ");
        scanf("%s %lf", p[i].subject, &p[i].marks); // &(p + i)->marks 도 가능
    }
    printf("\n");

    for (int i = 0; i < len; i++) {
        printf("%-10s %.1lf \n", p[i].subject, p[i].marks);
    }
    
    free(p);
}

+ Recent posts