arrays - 尝试使用 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;
}
}
解决方案
至少
错误的类型声明
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;
}
或更改NEWTYPE
为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;
}
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)
推荐阅读
- laravel-nova - 如何更改 Laravel Nova 资源索引页上行的背景颜色?
- angular - 如何对angular7中具有@Input变量的组件进行单元测试?
- android - ViewPager2 在使用 FragmentStateAdapter 时不刷新 Fragment View
- java - 在 springboot 应用程序 java.lang.IllegalArgumentException 中收到此错误:不是托管类型
- typescript - 未找到带有“字符串”类型参数的索引签名
- sql - JPA spring 不尊重 FetchType.LAZY
- android - 为什么添加 ScrollView 时 ImageView Image Zoomed?
- c++ - 转移到 setter 的参数
- sql - 如何使用列值范围应用 NTILE(4)?
- corda - 启动corda节点时数据库驱动程序错误