我仍然对编译解决代码时遇到的错误感到困惑。我尝试制作两个简单的功能。一个初始化数组并在每个索引中放入 0,另一个打印该函数。
以下代码:
#include <stdio.h>
#include <stdlib.h>
int arraybuilder(int len)
{
int *array;
array = (int*) malloc(len * sizeof(int));
for(int i = 0; i<len; i++)
{
array[i] = 0;
}
free(array);
return array;
}
void printarray(int array[], int len)
{
for(int i = 0; i < len; i++)
{
printf("array[%d] = %d\n", i, array[i]);
}
}
int main(int argc, char* argv[])
{
int len = 100;
int *array = arraybuilder(len);
printarray(array, len);
return 0;
}
>
malloctest.c: In function ‘arraybuilder’: malloctest.c:15:9: warning: return makes integer from pointer without a cast [-Wint-conversion] return array; ^
还有:
malloctest.c: In function ‘main’: malloctest.c:31:15: warning: initialization makes pointer from integer without a cast [-Wint-conversion] int *array = arraybuilder(len);
提前感谢您的帮助:)
最佳答案
free(array);
return array;
首先,这是一个问题,因为您正在通过尝试使用已释放的内存来调用未定义的行为。
其次检查返回类型 - 它应该返回 int
但返回 int*
。您遇到的两个错误都是由于您提到的 int
返回类型而出现的。 (更清楚地说,您返回了 array
,其类型为 int*
,并且您说您将返回 int
。这就是出现警告的原因)。
在第二种情况下,您应该将 int
分配给 int*
这就是它提示的原因。
您不需要转换 malloc
的返回值,从 void*
到 int*
的转换是隐式完成的。检查 malloc
的返回值,失败时返回 NULL
相应地处理这种情况。
int* arraybuilder(int len)
{
if( len <= 0){
fprintf(stderr,"Negative size\n");
exit(EXIT_FAILURE);
}
int *array = malloc(sizeof *array *len );
if( array == NULL ){
perror("malloc failed");
exit(EXIT_FAILURE);
}
for(int i = 0; i<len; i++)
array[i] = 0;
return array;
}
然后在 main()
中,当您使用完动态分配的内存后,您将释放它。在main()
printarray(array, len);
free(array);
return 0;
关于C Fuctions 中使用的 Heap 还不清楚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48250156/