二维指针的大小

Size of 2d pointers

我试图通过制作一个指向另一个实际上是字符串的指针的指针来提高我对指针的了解。

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

获得的尺码

指针形式

char** foo;

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

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

sizeof() 将像您在使用堆栈数组时预期的那样工作。如果测试声明为

char test[10][20];

然后 sizeof(test) 实际上会 return 200.

如果您要分配大的东西,您可以使用 malloc() 并且 malloc 接收一个参数 - 以字节为单位的大小(例如 malloc(sizeof(int)*20)malloc 也 returns 指向已分配内存的 void 指针。您通常会转换此指针以适合您的类型。 换句话说,您无法真正获得尺寸。您必须将它存储在某个地方并在需要时将其传递给其他函数。

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

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

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

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

How I can get it's length (=rows)?

你不能。在 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.

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

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