【发布时间】:2010-04-04 14:12:26
【问题描述】:
我正在使用 malloc 来检查是否可以为特定数组 z1 分配内存。 ARRAY_SIZE 是一个预定义的数值。我使用强制转换,因为我已经阅读过这样做是安全的。
long double *z1 = (long double *)malloc(sizeof (long double) * ARRAY_SIZE);
if(z1 == NULL){
printf("Out of memory\n");
exit(-1);
}
上面只是我的代码的一个sn-p,但是当我添加错误检查部分(包含在上面的if语句中)时,我得到了很多Visual Studio 2008的编译时错误。正是这个错误检查产生所有错误的部分。我做错了什么?
关于 malloc 的相关问题,我了解在使用变量/数组 z1 后需要释放/释放内存。对于数组 z1,我使用:
free(z1);
z1 = NULL;
第二行z1 = NULL有必要吗?
我收到 102 个错误...嗯,MVS2008 在 102 处停止错误。错误的类型为:
error C2143: syntax error : missing ';' before 'type'
error C2065: 'L' : undeclared identifier
// this error repeats for all my identifiers
并且 this 指向 if 语句中结束的 } 之后。
ARRAY_SIZE 相当大。我把它定义为
#define ARRAY_SIZE 2500001
我上面的完整代码太长了。但是我有一个较小的代码,它给了我相同的行为。抱歉格式化。我好像没弄好。
#include stdio.h //note I have the actual < > in my code
#include stdlib.h
#include math.h
#define ARRAY_SIZE 11
#define VECTOR_SIZE 5
main()
{
long double *z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);
if(z == NULL){
printf("Out of memory\n");
exit(-1);
}
long double *k = (long double*) malloc(sizeof (long double) * VECTOR_SIZE);
int i;
long double A, B;
void f(long double fa[], long double fb[], long double fA, long double fB);
A = 0.5;
B = 2;
for(i = 0; i < VECTOR_SIZE; i++){
k[i] = 0;
}
k[1] = 4;
k[2] = 8;
for(i = 0; i < ARRAY_SIZE; i++){
z[i] = 0;
}
z[1] = 5;
f(k, z, A, B);
free(z);
free(k);
z = NULL;
k = NULL;
}
void f(fa, fb, fA, fB)
long double fa[], fb[], fA, fB;
{
fa[0] = fb[1]* fA;
fa[1] = fa[1] - 1;
fb[0] = 2* fB - fa[2];
printf("fa[2] is 8 and is the same as *[fa + 2] and is %3.3Le\n", *(fa + 2));
printf("\nAddress of &fa[2] is %x\n", &fa[2]);
printf("same address is fa + 2 is %x\n", fa + 2);
return;
}
【问题讨论】:
-
错误信息是什么?
ARRAY_SIZE有多大? MSVS 2008 是否支持long double? (我真的不认为最后一个是问题,但请检查所有内容。)您是否包含定义 NULL 的标头? (对于malloc()和exit()和<stdio.h>,对于printf(),您同时需要<stdlib.h>。)您所做的大部分事情看起来都是正确的,所以是上下文造成了麻烦。 -
具体是什么错误?
-
谢谢大家。不,我没有定义 NULL。我不知道如何定义它。我在帖子中发布了一些错误。
-
你能发布你包含的标准标题吗?应通过 stdio.h 为您定义 NULL。
-
我正在使用 stdio.h、math.h 和 stdlib.h。 “conio”在以下答案之一中提供的小代码在我的机器上运行良好。