我试图通过指针指向另一个实际上是字符串的指针来提高我的知识。
现在我希望获得通常可以从sizeof(foo[0])/sizeof(foo[0][0])
指针形式
char** foo;
答案 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
}