2d指针的大小

时间:2017-06-28 10:29:41

标签: c pointers multidimensional-array size sizeof

我试图通过指针指向另一个实际上是字符串的指针来提高我的知识。

现在我希望获得通常可以从sizeof(foo[0])/sizeof(foo[0][0])

获得的大小

指针形式

char** foo;

4 个答案:

答案 0 :(得分:1)

你永远不会得到指针所指向的内存块的大小......因为它可以有任何东西。

test只是指向内存中存储其他指针的位置(第一个)。每个指针将再次通向Memory中的另一个位置,其中存储了一些字符值。因此,您的测试变量包含一个简单的数字(内存中的某个位置的索引),并且根据您的操作系统sizeof(test),无论分配的内存大小如何,都可能有4个字节或8个字节。

sizeof()将在使用堆栈数组时正常工作。如果test被声明为

char test[10][20];

然后sizeof(test)实际上将返回200。

答案 1 :(得分:1)

如果要分配大的内容,则使用malloc()malloc接收一个参数 - 大小(以字节为单位)(例如malloc(sizeof(int)*20))。  malloc还返回指向已分配内存的void指针。您通常会将此指针强制转换为适合您的类型。 换句话说,你无法真正达到这个规模。您必须将其存储在某处并在需要时将其传递给其他功能。

指向指针(**)的指针就像添加一个额外的维度。

[]这些更像是指针算术的语法糖。 a[i]*(a+i)相同。

这可能会因您的系统而异,但sizof()会为这些类型提供这些值。

int a;      //4
int b[5];   //20
int* c;     //8
int d[5][5];//100
int** e;    //8

答案 2 :(得分:1)

  

我怎样才能得到它的长度(=行)?

你做不到。阅读How to get the length of dynamically allocated two dimensional arrays in C

中的更多内容

您的尝试:

char** foo;
sizeof(foo[0])/sizeof(foo[0][0])

最有可能导致8,对吗?这是因为你得到一个指针的大小(在你的系统中可能是8),然后除以一个字符的大小,它总是1。

答案 3 :(得分:1)

sizeof(test)/sizeof(*test)不再使用您的声明指示元素的数量,因为编译器不知道指向的指针是什么,因为sizeof()是编译时操作因此不是动态的。 要查找没有元素,可以添加标记值:

char **test = {"New York", "Paris", "Cairo", NULL};
int testLen = -1;
while(test[++testLen] != NULL){
//DO NOTHING
}