【问题标题】:Size of 2d pointers二维指针的大小
【发布时间】:2017-06-28 10:29:41
【问题描述】:

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

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

指针形式

char** foo;

【问题讨论】:

  • 多长?尺寸? sizeof (char *)sizeof * test 就是为了这个。
  • C 和 C++ 不是同一种语言。选择一个。
  • 指向指针的指针不是二维数组。
  • @tambre C 和 C++ 有什么不同吗(除了 C++ 提供更好的选择)?只是为了理解指针,我认为询问 C 和 C++ 专家是有效的......

标签: c pointers multidimensional-array size sizeof


【解决方案1】:

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

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

【讨论】:

  • 谢谢大家,你们的回答也很好,对以后的使用很有帮助,很抱歉没能选到你们,但这正是我要找的。​​span>
【解决方案2】:

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

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

sizeof() 将按照您在使用堆栈数组时的预期工作。如果 test 被声明为

char test[10][20];

那么 sizeof(test) 实际上会返回 200。

【讨论】:

【解决方案3】:

我怎样才能得到它的长度(=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。

【讨论】:

    【解决方案4】:

    如果你分配的东西很大,你使用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
    

    【讨论】:

    • 谢谢你的回答,看来帮助满了,但可能是我的英文不好?或者这很难,但我永远无法知道 malloc 有什么作用,它的作用是什么。“字节大小”可以,但是这些有什么用? “还返回一个指向已分配内存的 void 指针”,好吧,我明白了,它在内存中返回了一个类似于 new 的指针……但我仍然感到困惑。你能在这里给我一个更典型的评论吗?
    • 顺便说一句,很抱歉回复不完整,我按了 mystake 输入
    • malloc 用于动态内存分配。要理解它,您必须首先了解程序如何使用内存。有一个stack 和一个heap int[5] a; 将被放置在堆栈上。如果您使用int* a = (int*)malloc(sizeof(int)*5),这将在堆上分配。在 c++ 中,您使用分配此内存的new。两个数组现在都可以像a[0] 一样从 0 迭代到 4,但第一个在堆栈上,第二个在堆上。另一件事是,只有在编译时知道大小时才能创建堆栈数组,例如使用常量来创建它。
    • 谢谢!!!但可能是一个具有空终止并帮助 strlen 确定大小的字符串,我可以对“行”做同样的事情。如果我使用 malloc,我确实需要执行经典的 new char/int/etc...?
    • @LaceanuGeorge 不幸的是,普通数组没有空终止符。您必须使用变量来保持大小,如果您正在编写将接收指向元素的指针的函数,您还必须将大小传递给函数,以便您知道何时停止。这与 C++ 中的情况不同。那里的容器有点复杂,它们知道自己的大小。对于std::vector,你有一个方法.size(),它会给你向量中元素的数量,但你也有.capacity(),它会给你分配的内存大小除以一个元素的大小。跨度>
    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 2012-10-09
    • 1970-01-01
    • 2014-11-10
    • 2013-11-28
    • 2017-06-11
    • 2019-09-04
    • 1970-01-01
    相关资源
    最近更新 更多