我有下面的代码,应该创建一个新的数组与参数中指定的元素的数量…
void *newArray(int nElements){
int *array = NULL;
array = (int *)malloc(nElements * sizeof(int));
if(array == NULL){
printf("Insufficient memory space.n");
return -1;
}
//Set all values to 0
for(int i = 0; i < nElements; i++){
array[i] = 0;
}
return array;
}
这个函数返回一个泛型指针,指向一个所有值都从0开始的整型数组。但是当我调用这个函数时…
int *array = NULL;
array = (int *)newArray(5);
抛出以下警告:
main.c:24:16: warning: incompatible integer to pointer conversion returning 'int' from a function with result type 'void *' [-Wint-conversion]
,如果我试图打印数组的内容,打印两个0。我还在熟悉C语言,我真的不明白这个警告是什么意思,以及我如何修复它,以便函数在这种情况下返回一个包含5个元素的数组。
函数的返回类型为void*
。这将使C尝试将return -1
中的整数字面值-1
转换为void*
,这是一种"不兼容的转换"。这种转换是可能的,但它通常不是您想要的(例如,与float
到double
的转换相反)。
要解决这个问题,只需返回空指针常量NULL
即可。
一些额外的建议:
- 查看
malloc
和sizeof
操作符的参数类型,它是size_t
。您可能希望让您的函数也接受size_t
。大小类型保证对任何理论上可以存储的对象来说都足够大,并且不能是负值。 - 可以通过调用
memset
将整个int
类型数组设置为零。首先分配内存,然后将其全部设置为零的操作可以使用对calloc
的一个函数调用来组合。 malloc
和calloc
失败时返回NULL
。所以你可以这样写:
int *array = (int*) malloc(nElements * sizeof(int));
if(array == NULL){
- 返回类型也可以是
int*
,因为该类型是硬编码到函数中的。但是,也许您正在逐渐编写类似calloc
的包装器,在分配失败时打印错误消息?
return -1;
返回-1
,这是一个整数,函数返回指针。
通知调用者出错的最常见方式是返回NULL。
void *newArray(size_t nElements){
int *array = NULL;
array = malloc(nElements * sizeof(*array));
if(array == NULL){
printf("Insufficient memory space.n");
}
else
{
//Set all values to 0
for(size_t i = 0; i < nElements; i++){
array[i] = 0;
}
return array;
}
如您所见,您不必添加第二个返回。一般来说,为了代码清晰,最好在函数中避免多次返回。
附加说明:
- 不要强制转换
malloc
返回指针。如果你的代码不能编译,这意味着你用c++编译器编译C代码,这是错误的。大多数c++编译器都有命令行选项来设置语言(例如g++ -xc
) 对象使用 - 不是in
sizeof
- 使用
size_t
设置size &数组索引。
我不知道你为什么返回void *
而不是int *
,但也许你有一些原因。