我必须在程序中使用动态长度的int数组,并且希望能够在我的代码中的不同点获取其中的对象数。我对C ++并不熟悉,但这就是我所拥有的。为什么它没给我合适的长度?感谢。
<#include <iostream>
Using Namespace std;
int length(int*);
void main()
{
int temp[0];
temp[0] = 7;
temp [1] = 10;
temp[2] = '\0';
cout << length(temp) << endl;
}
int length(int* temp)
{
int i = 0;
int count = 0;
while (*temp + i != '\0')
{
count++;
i++;
}
return count;
}
目前它只是进入无限循环; _;
答案 0 :(得分:15)
在C ++中,数组不是动态的。您的临时数组的长度为零,并且尝试写入超出其长度的成员是未定义的行为。它很可能无法正常工作,因为它会写入堆栈的某些部分。
创建一个固定大小的数组,其中有足够的空间放置您想要的所有内容,或者使用std::vector<int>
这是一个动态数据结构。
#include <iostream>
#include <vector>
using namespace std;
int length(int*);
int main () // error: ‘::main’ must return ‘int’
{
int temp[3];
temp[0] = 7;
temp[1] = 10;
// don't use char constants for int values without reason
temp[2] = 0;
cout << length(temp) << endl;
vector<int> vec_temp;
vec_temp.push_back(7);
vec_temp.push_back(10);
cout << vec_temp.size() << endl;
}
int length(int* temp)
{
int i = 0;
int count = 0;
while (*(temp + i) != 0) // *temp + i == (*temp) + i
{
count++;
i++; // don't really need both i and count
}
return count;
}
对于向量,不需要在开始时指定大小,并且可以放入零,并且查找长度是一个简单的操作,而不是需要循环。
循环中的另一个错误是你正在查看数组的第一个成员并将i添加到该值,而不是通过i递增指针。你真的不需要我和数,所以可以写几个其他的方式,或者直接递增temp:
int length(int* temp)
{
int count = 0;
while (*temp != 0)
{
++count;
++temp;
}
return count;
}
或使用count来索引temp:
int length(int* temp)
{
int count = 0;
while (temp[count] != 0)
++count;
return count;
}
答案 1 :(得分:5)
出于几个原因,这种做法是个坏主意,但首先是一些问题:
int temp[0];
这是一个包含0个项目的数组,我甚至认为它不允许用于堆栈元素。声明这样的数组时,必须指定您将使用的最大值数:例如int temp[10];
这非常重要! - 如果你指定的数字较少(例如[10]并使用[11])那么你将导致内存覆盖,最好崩溃,最坏的情况下奇怪的错误是追踪的噩梦。
下一个问题是这一行:
while (*temp + i != '\0')
该行的作用是将值存储在'temp'指定的地址中并添加i。你想要的是获取temp指定的地址的第n个元素的值,如下所示:
while (*(temp + i) != '\0')
所以这是错的,但是你应该花五分钟时间考虑更好的方法来做到这一点。
我提到它的原因是一个坏主意:
相反,我建议你维护一个单独的值来存储数组中的元素数量。一种非常常见的方法是创建一个包含这个概念的类(一个元素块和当前大小)。
C ++标准库附带了一个名为“vector”的模板类,可用于此目的。它与数组不完全相同(您必须在编制索引之前先添加项目),但它非常相似。它还支持复制/调整大小,这也很方便。
这是你编写的使用std :: vector的程序。而不是'长度'功能我添加了一些东西来打印出值:
#include <vector>
#include <iostream>
void print(std::vector<int> const& vec)
{
using namespace std;
for (size_t i = 0; i < vec.size(); i++)
{
cout << vec[i] << " ";
}
cout << endl;
}
int main()
{
std::vector<int> temp;
temp.push_back(7);
temp.push_back(10);
print(temp);
return 0;
}
答案 2 :(得分:4)
你可以尝试:
while (*(temp + i) != '\0')
您当前的解决方案是计算temp[0] + i
(等于7+i
),这显然不是您想要的。
答案 3 :(得分:3)
不仅C ++数组不像Pete所指出的那样是动态的,而只有字符串(char *)以'\ 0'结尾。 (这并不是说你不能对其他类型使用类似的约定,但它是相当不寻常的,并且有充分的理由:特别是,依赖终结符符号需要你遍历一个数组来找到它的大小!)
在像你这样的情况下,最好使用标准库。
#include <vector>
#include <iostream>
int main()
{
std::vector<int> v;
v.push_back(7);
v.push_back(10);
std::cout << v.size() << std::endl;
return 0;
}
答案 4 :(得分:2)
如果你不想使用std :: vector,试试这个:
#include <iostream>
using namespace std;
int main () {
int vet[] = {1,2,3,4,5,6};
cout << (sizeof (vet) / sizeof *(vet)) << endl;
return 0;
}
答案 5 :(得分:1)
获得固定长度数组大小的最常用方法是这样的:
int temp[256];
int len = sizeof (temp) / sizeof (temp[0]);
// len == 256 * 4 / 4 == 256 on many platforms.
这对动态数组不起作用,因为它们实际上是指针。
int* temp = new int[256];
int len = sizeof (temp) / sizeof (temp[0]);
// len == 4 / 4 == 1 on many platforms.
对于动态长度数组,如果您关心大小,最好在分配数组时将其存储在某处。
正如许多人所指出的,你的循环问题在于你在这里有一个运算符优先级问题:
*temp + i
应该是:
*(temp + i)
但是,上面也指出的更大的问题是你似乎没有理解指针与固定长度数组,并且正在写出数组的末尾。
答案 6 :(得分:1)
如果要正确使用数组,则必须分配足够的内存来存储值。一旦指定了它的长度,就无法改变它。要知道数组大小,您应该将其存储在变量中:例如:
int n;
cin>>n;
int array = new int[n];
int array_length=n;
如果要更改数组的长度,最好的方法是使用std容器,例如std :: vector。
答案 7 :(得分:0)
要在数组中获取动态行为,请使用std::vector
,或使用int *
使用手动内存分配(new
和delete
)回退旧学校c样式[*]
[*] C实现(在字符数组的上下文中讨论为C dynamic string length)使用malloc
,realloc
和free
,但这些应该在c ++中避免代码。
答案 8 :(得分:0)
因为您只为零元素数组分配空间。 以下几行
temp [1] = 10;
temp[2] = '\0';
不分配更多内存或调整阵列大小。您只是在数组外部编写数据,破坏了应用程序状态的其他部分。不要那样做。 ;)
如果你想要一个可调整大小的数组,你可以使用std :: vector(并使用push_back成员函数插入新值)
矢量也有size()成员函数,它告诉你当前的大小。
如果要使用基本数组,则必须自己跟踪大小。 (并且,当需要调整数组大小时,将旧数组中的所有元素复制到新的更大的元素中)
答案 9 :(得分:0)
这是您问题的答案
int myarr [] = {1, 2, 3, 4, 5};
int length = sizeof(myarr) / sizeof(myarr[0]);
cout << length;
答案 10 :(得分:-1)
试试这个:
int length(int* temp)
{
int count = 0;
while (*temp != 0 && *temp != -858993460)
{
++count;
++temp;
}
return count;
}