我仍然对编译解决代码时遇到的错误感到困惑。我尝试制作两个简单的函数。一个初始化数组并在每个索引中输入 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] = %dn", i, array[i]);
}
}
int main(int argc, char* argv[])
{
int len = 100;
int *array = arraybuilder(len);
printarray(array, len);
return 0;
}
>
malloctest.c:在函数'arraybuilder'中: malloctest.c:15:9:警告:return 从指针生成整数而不强制转换 [-Wint-conversion] 返回数组; ^
和:
malloctest.c:在函数"main"中: malloctest.c:31:15:警告:初始化使指针从整数不强制转换 [-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 sizen");
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;
您返回地址并且您的功能类型是整数,将功能返回类型从 int 更改为 int *。但是您的程序是释放返回指针后无效内存访问的示例,这将导致程序崩溃。
假设函数arraybuilder
返回一个指针,但其返回类型是 int
而不是 int *
。
int arraybuilder(int len);
此外,最好将参数的类型指定为无符号整数,例如size_t
因为很明显,分配的数组中的元素数不应为负值。
所以函数应该像
int * arraybuilder( size_t n );
在函数中,分配的内存被释放,因此返回指针的值无效。
free(array);
return array;
函数实现可能如下所示
int * arraybuilder( size_t n )
{
int *array;
array = ( int* )malloc( n * sizeof( int ) );
if ( array )
{
for ( size_t i = 0; i < n; i++ )
{
array[i] = 0;
}
}
return array;
}
函数printarray
不会更改数组。所以第一个参数应该用限定符const
声明。
void printarray( const int array[], size_t n )
{
for ( size_t i = 0; i < n; i++)
{
printf( "array[%zu] = %dn", i, array[i] );
}
}
负责释放分配内存的是函数main
。此外,在输出数组之前,您应该检查返回的指针是否不等于 NULL
。它的代码看起来像
int main( void )
{
size_t n = 100;
int *array = arraybuilder( n );
if ( array ) printarray( array, n );
free( array );
return 0;
}