malloc只分配4位?

时间:2010-07-22 10:29:06

标签: c++ malloc

我正在尝试制作一些c程序,我坚持使用malloc命令。这是我的代码:

        #include <stdlib.h>
        #include <iostream>
        #include "Oef1.h"
        using namespace std;

 some methode clled by main{
         int ** q=NULL;
         int m=read(q);
}


 int read(int ** q){
          int m=3;
          int n=5; //n and m are beeing asked, but for debugging hard-coded
          cout << sizeof(int*) << endl;     // returns 4
          cout <<sizeof(q) << endl;        //returns 4
          cout <<m*sizeof(int*) << endl;   //returns 12
          q=(int**)realloc(q,m*sizeof(int*));
          cout <<sizeof(q) << endl;         //should return 12 but returns 4
          for(int k =0; k < m; k++){
             q[k] = (int*)malloc(n*sizeof(int));
           }
            return m;
    }

问题是,在malloc命令之后,sizeof(q)仍然是4,它应该是12(3 * 4)。我知道你可以使用[]括号在c ++中创建数组,但我喜欢用malloc来实现学习目的。这可能是一个愚蠢的错误,但我找不到它。

4 个答案:

答案 0 :(得分:11)

sizeof返回数据类型的大小,这是一个指针。在您的系统上,您会发现指针总是4个字节(不是位)。在指针上使用时,sizeof不会返回数组的大小。

答案 1 :(得分:3)

sizeof(Any_Type)返回此类型的一个元素在内存中占用的大小。 在您的情况下,sizeof(q)是sizeof(int **),即指针的大小(通常为4或8,具体取决于您是在32位还是64位计算机上)。

此外,您会混淆位和字节。 sizeof以字节为单位返回大小,而不是位

答案 2 :(得分:2)

sizeof(q)将返回指针q的大小,而不是指针所指向的内容。

答案 3 :(得分:1)

sizeof(q)告诉您q的数据类型的大小,在您的情况下为int**sizeof永远不会告诉你动态分配的对象/数组的大小,如果没有,因为它在编译时被评估 - sizeof(x)甚至不可能返回同一x的不同值。类型的大小是编译时常量。

您的任务是跟踪分配的大小(传递给malloc()/new等的值,或者更确切地说使用将为您执行此操作的标准容器(std::vector)。