我仍然对编译解决代码时遇到的错误感到困惑。我试着做两个简单的功能。一个初始化数组并在每个索引中放置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;
}
&GT;
malloctest.c:在函数'arraybuilder'中: malloctest.c:15:9:警告:返回从指针生成整数而没有强制转换[-Wint-conversion] 返回数组; ^
和
malloctest.c:在函数'main'中: malloctest.c:31:15:警告:初始化使得整数指针没有强制转换[-Wint-conversion] int * array = arraybuilder(len);
提前感谢您的帮助:)
答案 0 :(得分:2)
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;
答案 1 :(得分:0)
你正在返回地址,你的功能类型是整数改变你的功能返回类型到int * int.But你的程序是一个无效的内存访问的例子,释放你的返回指针将导致程序崩溃。
答案 2 :(得分:0)
假设函数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] = %d\n", 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;
}