malloc:错误检查和释放内存

时间:2010-04-04 14:12:26

标签: c malloc

我正在使用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;
}

3 个答案:

答案 0 :(得分:3)

代码中的问题

奥莱特。现在您已经提供了所有代码,因此更容易解释您的问题:

  1. 您正在尝试定义函数“中间”的变量。 C不允许此。你必须在开始时定义所有变量。这就是给你的东西 error C2143: syntax error : missing ';' before 'type'
    错误。
  2. 同样适用于函数声明(需要位于函数的顶部)。
  3. 因此,将代码更改为以下内容可以使其正常工作:

    #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;
    }
    


    其他几点

    现在我将添加一些提示,可能不是严格的错误(意思是,它们仍然可以编译......),但不是很好的编码实践:

    1. 正如我之前所说,使用const来定义常量而不是#define s。
    2. 正确定义main() - 即int main() {...而不仅仅main()没有返回类型。它在C中工作,但在C ++中不起作用,我认为它很糟糕。 (为什么我本来应该假设函数返回int,如果没有其他的说法?为什么不能无效?)
    3. 之后,您应该显式返回main()
    4. 中的值
    5. 我更喜欢在void f(long double fa[], long double fb[], long double fA, long double fB);之外声明main()函数原型。
    6. 定义函数时使用现代语法 - 您在原型中使用的语法 - 而不是古代语法:
      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) {
    7. 这样你的代码就会变成:

      #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是判断内存未分配给指针的好方法。