C 在功能中使用的堆仍然不清楚



我仍然对编译解决代码时遇到的错误感到困惑。我尝试制作两个简单的函数。一个初始化数组并在每个索引中输入 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,这就是它抱怨的原因。

无需

强制转换 的返回值,mallocvoid*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;
}

相关内容

  • 没有找到相关文章

最新更新