For starters you need to initialize the variable flag in each iteration of the outer for loop before the inner for loop as for example
for(k = 0,num = 3; k<10; k++,num++) {
flag = 1;
for (int i = 2; i <= sqrt(num); i++) {
//...
However it is much better to set the flag in the case when the number is a prime number. For example
for(k = 0,num = 3; k<10; k++,num++) {
flag = 1;
for (int i = 2; flag && i <= sqrt(num); i++) {
if((num % i) == 0) flag = 0;
}
if(flag == 1)
arr[j++] = num;
}
The outer for loop is executed exactly 10 times independent on how many prime numbers were found.
So rewrite the loops at least like
for ( num = 3; j < 10; num += 2 ) {
flag = 1;
for (int i = 3; flag && i <= sqrt(num); i += 2) {
if((num % i) == 0) flag = 0;
}
if(flag == 1)
arr[j++] = num;
}
Here is a demonstration program. I renamed flag to prime.
#include <stdio.h>
int main( void )
{
enum { N = 10 };
int arr[N];
size_t j = 0;
arr[j++] = 2;
for ( int num = 3; j < N; num += 2 )
{
int prime = 1;
for ( int i = 3; prime && i <= num / i; i += 2 )
{
if (( num % i ) == 0) prime = 0;
}
if ( prime ) arr[j++] = num;
}
printf( "First %d Prime Numbers: ", N );
for (j = 0; j < N; j++) printf( "%d ", arr[j] );
putchar( '\n' );
}
The program output is
First 10 Prime Numbers: 2 3 5 7 11 13 17 19 23 29