【问题标题】:Length of pointer to pointer指针的指针长度
【发布时间】:2016-12-03 14:45:36
【问题描述】:

我进行了搜索,但没有找到与我的情况相似的任何内容。我有一个float**,而且我知道它是一种特殊类型的指针,因为它是一个包含指向另一个内存区域的float* 的元素数组。所以我写了一个简单的代码来检测这个矩阵的长度,更准确地说是float**里面的float +元素的长度;但它会导致分段错误。 这是我的代码:

int Loader:: Length(float** length)
{
    int count=0;
    while(*length[count]!='\0'){
        count++;

    }
    std::cout<<count<<std::endl;
    return count;

}

对不起我的英语,对不起这个愚蠢的问题。谢谢大家。

【问题讨论】:

  • 注意:** 不是“双指针”,而是“指向指针的指针”。 “双指针”通常被理解为double *

标签: c++ pointers segmentation-fault


【解决方案1】:

我有一个float**,我知道它是一种特殊类型的指针

不是真的。双指针只是单指针的一种特殊情况。它仍然是指向T 的指针,而T 恰好是float*

因为它是一个元素数组

不!它不是一个数组。它可能指向数组的第一个元素

具有指向另一个内存区域的 float*。

因此,更准确地说,float** 可能指向一个充满float* 的数组的第一个元素。那些float*s 指向的人是另一回事。

所以我写了一个简单的代码来检测这个矩阵的长度,

你不能。当你只有一个指向数组开头的指针时,大小信息已经丢失

也就是说,除非您对最后一个元素有 约定,例如 C 风格的字符串或带有 '\0' 终止符的字符串文字。这将我们带到下一点......

int Loader:: Length(float** length)
{
    int count=0;
    while(*length[count]!='\0'){

这是罪魁祸首。并非所有数组都以'\0' 终止。事实上,对于包含零分隔符的任意数组来说,这根本不是典型的。

因此,除非第一个元素length 指向的数组实际上包含一个与'\0' 比较的元素,否则您的循环将经过数组末尾的一个元素并尝试从那里读取。在那一刻,未定义的行为被调用,你的程序可以做任何事情,包括随机崩溃。


解决问题的最佳方法是使用std::vector,因为std::vector 总是知道自己的大小。所以让它std::vector&lt;float*&gt;。或者更好的是,std::vector&lt;std::vector&lt;float&gt;&gt;

事实上,如果它真的是一个矩阵,那就把它设为std::vector&lt;float&gt;,将所有内容连续存储,另外将矩阵的宽度存储在某处,并始终计算 X/Y 的偏移量。

【讨论】:

  • 谢谢我终于明白了。谢谢你;)
【解决方案2】:

问题是由于您期望所有数组都以与文字字符串相同的方式运行,即它们自动以 0 值终止。 C++ 或 C 都不是这样工作的。

如果您想要数组长度,您需要执行以下操作之一:

  1. 将长度与数组一起传递到各处。
  2. 使用 std::vector、std::deque 或 std::array 代替数组,并从中获取长度。

【讨论】:

  • 好的,但我很好奇..为什么当我尝试访问元素时它会返回分段错误? (*长度[计数])
  • @P.Carlino 因为在某些时候你会尝试访问一个你没有保留的内存地址并且操作系统会抱怨。
  • 但它是保留的...尝试使用 length[num1][num2] 它可以工作
  • 但是如果你的浮点指针数组最后没有空指针(即你没有设置它)那么什么会阻止你的代码运行到你没有的内存中' t 保留?
猜你喜欢
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 2014-10-31
  • 2016-10-30
相关资源
最近更新 更多