1

I'm trying to create a 2d array, specifically an adjacency matrix for directed graphs. I've never tried this with dynamic memory allocation before and I've hit a snag. Here's the code:

int n, i;
printf("Number of nodes is: ");
scanf("%d", &n);

int ** array = malloc(n * sizeof(int*));
for(i = 0; i < n; i++)
    array[i] = malloc(n * sizeof(int));

printf("Number of edges is: ");
scanf("%d", &m);

int x, y;
for(i=0;i<m;i++)
{
    scanf("%d %d", &x, &y);
    array[x][y]=1;
}

As soon as I finish entering all the edges, the program stops working and throws the usual "exe has stopped working".

Where's the problem?

EDIT: houssam spotted my error. The first "for" should have gone from 1 to n. When I entered 1 6 as an edge, the program crashed because there were only nodes 0-5. Thanks for spotting that. Such a simple mistake.....

9
  • your forget to free ? Commented May 12, 2015 at 17:03
  • Where exactly does it crash? Could you mark the point at the code? Also, did you validate your own input? Commented May 12, 2015 at 17:08
  • 2
    is it possible that you entered some wrong "x y" values? Commented May 12, 2015 at 17:08
  • 1
    Could you give the whole program? Nothing here (other than out of bounds inputs) would cause a crash.. Commented May 12, 2015 at 17:12
  • You probably also want to explicitly initialize each array[i][j] to 0, either with another loop or by using calloc. Commented May 12, 2015 at 17:17

1 Answer 1

1

you may entered wrong values for x or y , their values should be less than n and greater than or equal to 0:

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

int main()
{
    int m ,n, i;
    printf("Number of nodes is: ");
    scanf("%d", &n);

    int ** array = malloc(n * sizeof(int*));
    for(i = 0; i < n; i++)
        array[i] = malloc(n * sizeof(int));

    printf("Number of edges is: ");
    scanf("%d", &m);

    int x, y;
    for(i=0;i<m;i++)
    {
        scanf("%d %d", &x, &y);
        if (x >=0 && y >= 0 && x < n && y < n) // here
            array[x][y]=1;
        else
            printf("error in your values x=%d y=%d\n" , x , y);
    }
    return 0;
}

EDIT #1:
based on comment from user : M Oehm to check the return value of scanf , see:
scanf fails why? , I can refactor the code to be like:

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

int main()
{
    int m ,n, i;
    printf("Number of nodes is: ");
    scanf("%d", &n);

    int ** array = malloc(n * sizeof(int*));
    for(i = 0; i < n; i++)
        array[i] = malloc(n * sizeof(int));

    printf("Number of edges is: ");
    scanf("%d", &m);

    int x, y;
    for(i=0;i<m;i++)
    {
        //int num_read = scanf("%d %d", &x, &y);
        if(scanf("%d %d", &x, &y) < 2)
        {
            printf("please enter valid two integers..\n");          
            while (getchar() != '\n'); // read all characters in the input stream.
        }
        else if (x >=0 && y >= 0 && x < n && y < n) // here
        {
            array[x][y]=1;
            printf("array[%d][%d]=1;\n" , x, y);

        }
        else
            printf("error in your values x=%d y=%d\n" , x , y);
    }
    return 0;
}
Sign up to request clarification or add additional context in comments.

1 Comment

While you're at it: Why not check the return value of scanf?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.