指针指针的长度

时间:2016-12-03 14:45:36

标签: c++ pointers segmentation-fault

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

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

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

}

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

2 个答案:

答案 0 :(得分:2)

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

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

  1. 将长度与阵列一起传递到处。
  2. 使用std :: vector,std :: deque或std :: array而不是数组,并从中获取长度。

答案 1 :(得分:2)

  

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

不是真的。双指针只是单个指针的特例。它仍然是指向T的指针,而T恰好是float*

  

因为它是一个元素数组

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

  

有浮点*指向另一个内存区域。

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

  

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

你做不到。如果只有一个指向数组开头的指针,则大小信息已经丢失

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

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

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

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

问题的最佳解决方案是使用std::vector,因为std::vector始终知道自己的大小。所以把它std::vector<float*>。或者更好的是,std::vector<std::vector<float>>

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