#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int n, sum = 0;
scanf("%d", &n);
char num[n];
scanf("%s", num);
for (int i = 0; i < n; i++) sum += num[i] - '0';
printf("%d", sum);
}

이 코드에서 num배열이 n을 변수로 받아서 선언되는데 이게 왜 되는건가요?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
int main(void) {
int n, sum = 0;
scanf("%d", &n);
char* num = (char*)malloc(sizeof(char) * n);
scanf("%s", num);
for (int i = 0; i < n; i++) sum += num[i] - '0';
printf("%d", sum);
}

이 코드처럼 동적배열하는거랑 차이점이 있나요?