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

时间:2018-01-14 13:40:05

标签: c pointers malloc

我仍然对编译解决代码时遇到的错误感到困惑。我试着做两个简单的功能。一个初始化数组并在每个索引中放置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);

提前感谢您的帮助:)

3 个答案:

答案 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;
}