我正在尝试制作一些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来实现学习目的。这可能是一个愚蠢的错误,但我找不到它。
答案 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
)。