【问题标题】:C, function in switch caseC、switch case中的函数
【发布时间】:2021-04-02 15:00:25
【问题描述】:

我正在尝试生成随机矩阵或由程序用户使用其中具有功能的开关盒填充它。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void randomly(int **matrix, int r, int c)
{
    int i, j;
    srand(time(NULL));
    for(i=0; i<r; i++)
    {
        for(j=0; j<c; j++)
        {
            matrix[r][c] = rand() % 10;
        }
    }
}

void fill_normal(int **matrix, int r, int c)
{
    int i, j;
    printf("\nEnter matrix elements :\n");
    for(i=0; i<r; i++)
    {
        for(j=0; j<c; j++)
        {
            printf("ENTER FOR --> [%d,%d] : ",i+1,j+1);
            scanf("%d",&matrix[i][j]);
        }
    }
}

void print_matrix(int **matrix, int r, int c)
{
    int i, j;
    for(i=0; i<r; i++)
    {
        for(j=0; j<c; j++)
        {
            printf("%d\t",matrix[i][j]);
        }
        printf("\n");   /*new line after row elements*/
    }
}

int main()
{
    int r, c;
    printf("Enter the rows and cols of matrix:\n");
    scanf("%d%d", &r,&c);


    int **matrix = malloc(r * c * sizeof(int));

    int o;
    printf("Enter 1 if you want to generate the numbers randomly:\n");
    printf("Enter 2 if you want to enter the number by yourself:\n");
    scanf("%d",&o);
    printf("\n\n\n");
    switch(o)
    {
        case 1:
            randomly(matrix,r,c);
            print_matrix(matrix,r,c);
            break;
        case 2:
            fill_normal(matrix,r,c);
            print_matrix(matrix,r,c);
            break;
        default:
            printf("!!!WRONG OPERATOR!!!");
            break;
    }
    free(matrix);
    return 0;
}

对于案例 1:我什么也没看到,程序停止了,什么也没显示。 对于案例 2:我开始填充矩阵,但在 matrix[3][1] 程序崩溃 我不知道我能不能让功能中的人代码是正确的,但它们不起作用 提前谢谢!!!!

【问题讨论】:

标签: c multidimensional-array malloc


【解决方案1】:

matrix 不是真正的二维数组,而是指向指针的指针。因此,它可以指向int *数组的第一个元素,每个元素都可以指向int数组的第一个元素。

所以当您使用matrix[i][j] 时,第一个下标取消引用int * 数组,第二个下标取消引用int 数组。但是在引用matrix[i][j] 之前,您从未将matrix[i] 设置为有效的指针值,因此您会得到undefined behavior

与其将matrix 指向r*c 类型为int 的值的内存块,它首先需要指向r 类型为int * 的元素,然后每个指向c 元素int 类型:

int i;
int **matrix = malloc(r * sizeof(int *));
for (i=0; i<r; i++) {
    matrix[i] = malloc(c * sizeof(int));
}

然后要清理它,你可以做相反的事情:

for (i=0; i<r; i++) {
    free(matrix[i]);
}
free(matrix);

另外,您在 randomly 中使用了错误的数组索引:

matrix[r][c] = rand() % 10;

你想要:

matrix[i][j] = rand() % 10;

【讨论】:

    【解决方案2】:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    void randomly(void *matrix, size_t r, size_t c)
    {
        size_t i, j;
        int (*m)[r][c] = matrix;
        srand(time(NULL));
        for(i=0; i<r; i++)
        {
            for(j=0; j<c; j++)
            {
                (*m)[i][j] = rand() % 10;
            }
        }
    }
    
    void fill_normal(void *matrix, size_t r, size_t c)
    {
        size_t i, j;
        int (*m)[r][c] = matrix;
        printf("\nEnter matrix elements :\n");
        for(i=0; i<r; i++)
        {
            for(j=0; j<c; j++)
            {
                printf("ENTER FOR --> [%d,%d] : ",i+1,j+1);
                scanf("%d",&(*m)[i][j]);
            }
        }
    }
    
    void print_matrix(void *matrix, size_t r, size_t c)
    {
        size_t i, j;
        int (*m)[r][c] = matrix;
        for(i=0; i<r; i++)
        {
            for(j=0; j<c; j++)
            {
                printf("%d\t",(*m)[i][j]);
            }
            printf("\n");   /*new line after row elements*/
        }
    }
    
    int main()
    {
        int r = 7, c = 10;
        printf("Enter the rows and cols of matrix:\n");
        //scanf("%d%d", &r,&c);
    
    
        int *matrix = malloc(r * c * sizeof(int));
    
        int o;
        printf("Enter 1 if you want to generate the numbers randomly:\n");
        printf("Enter 2 if you want to enter the number by yourself:\n");
        //scanf("%d",&o); 
        o = 1;
        printf("o = %d\n\n\n", o);
        switch(o)
        {
            case 1:
                randomly(matrix,r,c);
                print_matrix(matrix,r,c);
                break;
            case 2:
                fill_normal(matrix,r,c);
                print_matrix(matrix,r,c);
                break;
            default:
                printf("!!!WRONG OPERATOR!!!");
                break;
        }
        free(matrix);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 2013-08-22
      • 1970-01-01
      相关资源
      最近更新 更多