如何在不使用stdlib.h的情况下执行此代码

时间:2017-05-04 15:35:33

标签: c debugging malloc warnings

我一直收到关于malloc的错误,我正试图找出如何在不使用标头中的stdlib.h的情况下使用此代码。只是stdio.h,这可能吗?怎么样?因为我完全糊涂了

spark-submit

我一直收到这个错误:

#include <stdio.h>

void allocate(int* score_array, const int input)
{
    int iter;

    for(iter = 1;iter <= 11;++iter)
    {
        if( (input < iter*10) && (input >= (iter-1)*10 ) )
        {
            ++(score_array[iter-1]);
        }
    }
}

void printf_star(const int len)
{
    int iter;

    for(iter = 0;iter < len;++iter)
    {
        printf("*");
    }

    printf("\n");
}

int main()
{
    int iter, size, temp;
    int* buffer;
    int score_array[11];

    for(iter = 0;iter < 11;++iter)
    {
        score_array[iter] = 0;
    }

    printf("How many grades will you be entering?\n");
    printf("Enter a number between 1 and 100: ");
    scanf("%d", &size);

    buffer = (int*)malloc(size*sizeof(int));

    for(iter = 1;iter <= size;++iter )
    {
        printf("Getting grade %d. You have %d grade(s) left to enter\n", iter, size-iter+1);
        printf("Enter a number between 0 and 100: ");
        scanf("%d",&temp);

        if( (temp>=0) && (temp <= 100) )
        {
            buffer[iter-1] = temp;
        }
        else
        {
            do
            {
                printf("Invalid Value!\n");
                printf("Getting grade %d. You have %d grade(s) left to enter\n", iter, size-iter+1);
                printf("Enter a number between 0 and 100: ");
                scanf("%d",&temp);
            }
            while( (temp < 0) || (temp > 100) );
        }
    }

    for(iter = 1;iter <= size;++iter)
    {
        allocate(score_array, buffer[iter-1]);
    }

    for(iter = 0;iter < 11;++iter)
    {
        printf_star(score_array[iter]);
    }

    return 0;
}

3 个答案:

答案 0 :(得分:2)

这只是一个警告,而不是实际错误,所以程序仍在编译。

要消除警告,您可以在文件中声明malloc:

#include <stdio.h>
extern void * malloc(unsigned long);

你也可以只包括stdlib.h,除非你有一个主要的理由不这样做。

答案 1 :(得分:1)

头文件只使用console.php关键字定义函数原型。 malloc的实际实现驻留在libc中,具体取决于操作系统。

没有定义函数/系统调用原型是确实警告,而不是编译时错误,与许多人在评论中传达的内容相反!

enter image description here

进入实际的解决方法,如果您想避免使用extern,则需要使用:

  1. #include <stdlib.h> 自c89以来已弃用
  2. 使用#include <malloc.h>
  3. 自行定义标题

    @Chris Rouffer的积分! :)

答案 2 :(得分:0)

如果要访问stdlib.h函数,则需要包含malloc(),因为这是定义它的位置。否则编译器不知道该怎么做。 如果你想使用这个函数,你真的应该在你的代码中包含标题,但是,理论上你可以在源代码中粘贴malloc()的实现,然后在没有标题的情况下从那里使用它。但是,这是个坏主意,因为任何查看代码的人都希望malloc()能够引用stdlib.h中定义的标准实现。