C - 分配动态数组后无法接收输入

时间:2014-04-17 16:17:05

标签: c arrays dynamic

我需要有人告诉我这里我做错了什么。

void main(void) {
    int *arr,n,i;

    printf("Enter the number of elements you want to enter=");
    scanf("%d",&n);

    arr = (int*)calloc(n,sizeof(int));

    if(!arr)
        return;

    for(i=0;i<n;i++)
        scanf("%d",&arr[i]);

    for(i=0;i<n;i++)
        printf("%d ",arr[i]);

    free(arr);
}

这只是一个简单的程序,用于输入数组中的项目数,然后获取输入并打印输入的值。但是,每当我从用户那里获取项目数量后输入数组中的值,我的程序崩溃。我不明白我在这里做错了什么。需要立即帮助。请运行该程序,看看它是否也在其他系统上崩溃。我使用在线编译器执行程序,奇怪的是它运行正常。我正在使用 Visual Studio 2013命令行编译器来执行我的程序。

1 个答案:

答案 0 :(得分:1)

gcc编译这段代码我得到:

calloc.c: In function ‘main’:
calloc.c:4:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
calloc.c:5:5: warning: incompatible implicit declaration of built-in function ‘scanf’ [enabled by default]
calloc.c:7:17: warning: incompatible implicit declaration of built-in function ‘calloc’ [enabled by default]
calloc.c:18:5: warning: incompatible implicit declaration of built-in function ‘free’ [enabled by default]

使用clang

calloc.c:1:1: error: 'main' must return 'int'
void main(void) {
^
calloc.c:4:5: warning: implicitly declaring C library function 'printf' with type 'int (const char *, ...)'
    printf("Enter the number of elements you want to enter=");
    ^
calloc.c:4:5: note: please include the header <stdio.h> or explicitly provide a declaration for 'printf'
calloc.c:5:5: warning: implicitly declaring C library function 'scanf' with type 'int (const char *, ...)'
    scanf("%d",&n);
    ^
calloc.c:5:5: note: please include the header <stdio.h> or explicitly provide a declaration for 'scanf'
calloc.c:7:17: warning: implicitly declaring C library function 'calloc' with type 'void *(unsigned long, unsigned long)'
    arr = (int*)calloc(n,sizeof(int));
                ^
calloc.c:7:17: note: please include the header <stdlib.h> or explicitly provide a declaration for 'calloc'
calloc.c:18:5: warning: implicit declaration of function 'free' is invalid in C99 [-Wimplicit-function-declaration]
    free(arr);
    ^
4 warnings and 1 error generated.

正如clang所指出的那样,你需要添加

#include <stdlib.h>
#include <stdio.h>

到代码的顶部,因为您正在使用在其中声明的函数。您正在使用的函数位于标准C库中,因此代码仍将编译,但您应该预料到意外。程序崩溃的原因可能是编译器对calloc的返回类型做出了错误的假设,因为它没有正确的声明。许多系统会让你逃脱这一点,但至少他们警告你。

在旁注中,请参阅this discussion,了解malloc不要将其)的返回值。此建议也适用于calloc


修改

这是一个可以解释这个问题的最小例子:

a.c

#include <stdio.h>

int main()
{
    printf("%f\n", f());
    return 0;
}

b.c

float f()
{
    return 4.2;
}

这两个文件可以单独编译成目标文件:

gcc -c a.c      # creates a.o
gcc -c b.c      # creates b.o

不会产生任何警告或错误。切换到C99模式会导致“隐式函数声明”警告。请注意,在编译时,不需要函数定义。可以链接这两个目标文件:

gcc a.o b.o

现在,链接器找到函数的定义,因此没有错误,但已经太晚了。编译f()a.c的隐式声明导致程序运行时输出不正确(我得到0.000000)。

在你的问题中发生了同样的事情。可以找到函数calloc,因此链接时没有错误。但是,对它返回的类型做出了错误的假设,因此它在您的系统上的行为不符合预期。