不兼容的整数到指针的转换返回'int'从结果类型为'void *'的函数



我有下面的代码,应该创建一个新的数组与参数中指定的元素的数量…

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*,这是一种"不兼容的转换"。这种转换是可能的,但它通常不是您想要的(例如,与floatdouble的转换相反)。

要解决这个问题,只需返回空指针常量NULL即可。

一些额外的建议:

  • 查看mallocsizeof操作符的参数类型,它是size_t。您可能希望让您的函数也接受size_t。大小类型保证对任何理论上可以存储的对象来说都足够大,并且不能是负值。
  • 可以通过调用memset将整个int类型数组设置为零。首先分配内存,然后将其全部设置为零的操作可以使用对calloc的一个函数调用来组合。
  • malloccalloc失败时返回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;
}
如您所见,您不必添加第二个返回。一般来说,为了代码清晰,最好在函数中避免多次返回。

附加说明:

  1. 不要强制转换malloc返回指针。如果你的代码不能编译,这意味着你用c++编译器编译C代码,这是错误的。大多数c++编译器都有命令行选项来设置语言(例如g++ -xc)
  2. 对象使用
  3. 不是insizeof
  4. 使用size_t设置size &数组索引。

我不知道你为什么返回void *而不是int *,但也许你有一些原因。

最新更新