首页 > 解决方案 > 尝试使用 typedef 创建二维数组的执行错误

问题描述

我从我的代码中收到以下错误:

warning: incompatible pointer to integer conversion initializing 'int' with an expression of type 'void *' [-Wint-conversion]
int checkeredArray = malloc(floor(((N * N) + 1)/2) * sizeof(int));

warning: incompatible integer to pointer conversion returning 'int' from a function with result type 'NEWTYPE' (aka 'int *'); take the address with & [-Wint-conversion]
return checkeredArray;

我的代码如下。我做错了什么?

#include <math.h>
#include <stdlib.h>

typedef int* NEWTYPE;

NEWTYPE ARRAY(int N);

int STORE(NEWTYPE as, int N, int row, int col, int val);

int FETCH(NEWTYPE as, int N, int row, int col);


NEWTYPE ARRAY(int N)
{
    int checkeredArray = malloc(floor(((N * N) + 1)/2) * sizeof(int));
    //    if (checkeredArray == NULL)
    //    {
    //        printf("Malloc failed!\n");
    //        return -1;
    //    }
    return checkeredArray;
}


int STORE(NEWTYPE as, int N, int row, int col, int val)
{
    int temp;

    if ((row & 1) != (col & 1))
    {
        return -1;
    }
    else if (row < 0 || col < 0)
    {
        return -1;
    }
    else if (row >= N || col >= N)
    {
        return -1;
    }
    else {
        temp = ((N * row)/2) + (col/2);
        as = as + temp;
        *as = val;

        return 1;
    }
}

int FETCH(NEWTYPE as, int N, int row, int col)
{
    if ((row & 1) != (col & 1))
    {
        return -1;
    }
    else if (row < 0 || col < 0)
    {
        return -1;
    }
    else if (row >= N || col >= N)
    {
        return -1;
    }
    else {
        int temp = ((N * row) / 2) + (col / 2);

        as = as + temp;

        int val = *as;

        return val;
    }

}

标签: arraysc

解决方案


至少

错误的类型声明

int checkeredArray应该是指针,而不是int.

typedef int* NEWTYPE;
NEWTYPE ARRAY(int N) {
    // int checkeredArray = malloc(floor(((N * N) + 1)/2) * sizeof(int));
    NEWTYPE checkeredArray = malloc(floor(((N * N) + 1)/2) * sizeof(int));
    return checkeredArray;
}

或更改NEWTYPEint

typedef int NEWTYPE;
NEWTYPE *ARRAY(int N) {
    // int checkeredArray = malloc(floor(((N * N) + 1)/2) * sizeof(int));
    NEWTYPE *checkeredArray = malloc(floor(((N * N) + 1)/2) * sizeof(int));
    return checkeredArray;
}

floor()不需要浮点函数

整数数学除法向 0 截断,丢弃分数。

    // NEWTYPE checkeredArray = malloc(floor(((N * N) + 1)/2) * sizeof(int));
    NEWTYPE checkeredArray = malloc( ((N * N) + 1)/2) * sizeof(int));

分配给被引用对象的大小,而不是类型。

更容易正确编码、审查和维护。
注意指针的类型在checkeredArray这里并不重要——它只是一个指针。

    // checkeredArray = malloc( ((N * N) + 1)/2) * sizeof(int));
    checkeredArray = malloc(sizeof (*checkeredArray) * ((N * N) + 1)/2));

int对比size_t

int N很大时,N * N可能会溢出,而对于size_t数学,它不太可能。

    // ((N * N) + 1)/2)
    (((size_t) N * N) + 1)/2)

或更改签名。

// NEWTYPE ARRAY(int N)
NEWTYPE ARRAY(size_t N)

推荐阅读