我需要有人告诉我这里我做错了什么。
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命令行编译器来执行我的程序。
答案 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
,因此链接时没有错误。但是,对它返回的类型做出了错误的假设,因此它在您的系统上的行为不符合预期。