我正在使用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);
}
以上只是我的代码片段,但是当我添加错误检查部分(包含在上面的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
并在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;
}
答案 0 :(得分:3)
奥莱特。现在您已经提供了所有代码,因此更容易解释您的问题:
error C2143: syntax error : missing ';' before 'type'
因此,将代码更改为以下内容可以使其正常工作:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define ARRAY_SIZE 11
#define VECTOR_SIZE 5
main() {
void f(long double fa[], long double fb[], long double fA, long double fB);
long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);
long double* k = (long double*) malloc(sizeof (long double) * VECTOR_SIZE);
int i;
long double A, B;
if (z == NULL) {
printf("Out of memory\n");
exit(-1);
}
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;
}
现在我将添加一些提示,可能不是严格的错误(意思是,它们仍然可以编译......),但不是很好的编码实践:
const
来定义常量而不是#define
s。main()
- 即int main() {...
而不仅仅main()
没有返回类型。它在C中工作,但在C ++中不起作用,我认为它很糟糕。 (为什么我本来应该假设函数返回int,如果没有其他的说法?为什么不能无效?)main()
。void f(long double fa[], long double fb[], long double fA, long double fB);
之外声明main()
函数原型。void f(fa, fb, fA, fB)
long double fa[], fb[], fA, fB;
{
void f(long double fa[], long double fb[], long double fA, long double fB) {
。这样你的代码就会变成:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void f(long double fa[], long double fb[], long double fA, long double fB);
int main() {
const int ARRAY_SIZE = 11;
const int VECTOR_SIZE = 5;
long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);
long double* k = (long double*) malloc(sizeof (long double) * VECTOR_SIZE);
int i;
long double A, B;
if (z == NULL) {
printf("Out of memory\n");
exit(-1);
}
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;
return 0;
}
void f(long double fa[], long double fb[], long double fA, long double 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;
}
我认为哪个更好。
请提供您的所有代码。我在Visual C ++ 2008 Express上测试了以下代码,禁用了“语言扩展”和4级警告。它运作得很好:
#include <stdlib.h>
#include <stdio.h>
int main() {
const int ARRAY_SIZE = 1024*1024;
long double *z1 = (long double *)malloc(sizeof (long double) * ARRAY_SIZE);
if (z1 == NULL) {
printf("Out of memory\r\n");
exit(-1);
}
printf("Awesome!\r\n");
return 0;
}
也许你忘记了一个包含,也许你做了别的错误。代码片段本身似乎完全没问题。您描述的第二个错误似乎完全不相关:
error C2065: 'L' : undeclared identifier // this error repeats for all my identifiers
顺便说一句,首选const
而不是#define
。
答案 1 :(得分:1)
尝试#include-ing stdio.h和stdlib.h以确保实际定义了NULL。
要回答你的第二个问题,将z1设置为NULL是没有必要的,尽管它会帮助你确保在释放后不会无意中尝试使用z1,因为取消引用空指针会崩溃。所以它是一个很好的防御性的事情,但不是必需的。
答案 2 :(得分:0)
如果分配了z1
,您可能需要检查代码的其他位置。将其设置为NULL
是判断内存未分配给指针的好方法。