C编译器警告:从不兼容的指针类型分配

时间:2016-12-20 10:09:11

标签: c arrays pointers

这是我的学校项目,我只制作骨架,但编译器说

  

[警告]从不兼容的指针类型

分配

我改变了一些指针,但它无法正常工作。任何人都可以帮助我吗?

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

int main(int argc, char *argv[])
{

    int *col_num, *row_num, **matrix;
    double k, l;
    int i, j;

    printf("Enter your column number:\n");
    scanf("%d", &col_num);
    printf("Enter your row number:\n");
    scanf("%d", &row_num);

    matrix[*col_num] = (int **) malloc(*col_num * sizeof(int));
    if (matrix[*col_num] == NULL)
        printf("No free Memory!");
    matrix[*row_num] = (int **) malloc(*row_num * sizeof(int));
    if (matrix[*row_num] == NULL)
        printf("No free Memory!");

    for (i = 0; i < *col_num; i++)
        for (j = 0; j < *row_num; j++)
        {

            printf("Please Enter %d%d matrix:", i + 1, j + 1);
            scanf("%lf", &matrix[i][j]);
        }

    for (i = 0; i < *col_num; i++)
    {
        for (j = 0; j < *row_num; j++)
        {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    free(matrix);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

首先,在这一部分:

int *col_num, *row_num, **matrix;

printf("Enter your column number:\n");
scanf("%d", &col_num);
printf("Enter your row number:\n");
scanf("%d", &row_num);

col_numrow_num不应该是指针,你可以这样做:

int col_num, row_num, **matrix;

printf("Enter your column number:\n");
scanf("%d", &col_num);
printf("Enter your row number:\n");
scanf("%d", &row_num);

此外,检查scanf()的返回值也不是一个坏主意,以防万一用户输入垃圾。

您似乎也在程序中编写matrix[*row_num] = .........之类的内容,这是不必要的。您不应该在任何地方引用*row_num*col_num。相反,只需自己调用row_numcol_num,这应该没问题。

如果您想使用最初难以使用的**matrix,则需要谨慎使用malloc来完成此操作。另请参阅Should I cast the return value of malloc

首先开始:

  • 为行分配内存:

    int **matrix = malloc(row_num * sizeof(*matrix)); /* check return value */
    
  • 然后对于每一行,malloc()列的一些内存:

    for (i = 0; i < row_num; i++) {
        matrix[i] = malloc(col_num * sizeof(*matrix[i])); /* check return value */
    
  • 然后free最后的指针:

    free(matrix[i]);
    
    free(matrix);
    

使用这些想法后,您的代码看起来应该是这样的(除非我误解了您的代码的目的):

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

int
main(int argc, char *argv[]) {
    int row_num, col_num, **matrix;
    int i, j;

    printf("Enter your column number: ");
    if (scanf("%d", &col_num) != 1) {
        printf("Invalid input\n");
        exit(EXIT_FAILURE);
    }

    printf("Enter your row number: ");
    if (scanf("%d", &row_num) != 1) {
        printf("Invalid input\n");
        exit(EXIT_FAILURE);
    }

    matrix = malloc(row_num * sizeof(*matrix)); /* Or sizeof(int *) */
    if (!matrix) {
        printf("Cannot allocate memory for pointer.\n");
        exit(EXIT_FAILURE);
    }

    for (i = 0; i < row_num; i++) {
        matrix[i] = malloc(col_num * sizeof(*matrix[i])); /* Or sizeof(int) */
        if (!matrix[i]) {
            printf("Cannot allocate memory for pointer.\n");
            exit(EXIT_FAILURE);
        }

        for (j = 0; j < col_num; j++) {
            printf("Please Enter %d%d matrix: ",i+1,j+1);
            if (scanf("%d", &matrix[i][j]) != 1) {
                printf("Invalid input\n");
                exit(EXIT_FAILURE);
            }
        }
    }

    printf("Your 2D array:\n");
    for (i = 0; i < row_num; i++) {
        for (j = 0; j < col_num; j++) {
            printf("%d ", matrix[i][j]);
        }
        free(matrix[i]);
        matrix[i] = NULL;
        printf("\n");
    }

    free(matrix);
    matrix = NULL;

    return 0;
}