我搜索过,但没有发现任何像我的情况。我有float**
并且我知道它是一种特殊类型的指针,因为它是一个元素数组,其float*
指向另一个内存区域。所以我写了一个简单的代码来检测这个矩阵的长度,更准确地说是float**
里面的float +元素的长度;但它会导致分段错误。
这里有我的代码:
int Loader:: Length(float** length)
{
int count=0;
while(*length[count]!='\0'){
count++;
}
std::cout<<count<<std::endl;
return count;
}
对不起我的英语,抱歉这个愚蠢的问题。谢谢大家。
答案 0 :(得分:2)
问题是由于您期望所有数组以与文字字符串相同的方式运行,即它们自动以0值终止。 C ++或C都不是这样的。
如果您需要数组长度,则需要执行以下操作之一:
答案 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的偏移量。