Int Array Length C ++

时间:2009-03-25 22:52:26

标签: c++ arrays

我必须在程序中使用动态长度的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;
}

目前它只是进入无限循环; _;

11 个答案:

答案 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')

所以这是错的,但是你应该花五分钟时间考虑更好的方法来做到这一点。

我提到它的原因是一个坏主意:

  • 您需要在需要长度时遍历整个数组
  • 您永远不能将终止元素(在本例中为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 *使用手动内存分配(newdelete)回退旧学校c样式[*]

[*] C实现(在字符数组的上下文中讨论为C dynamic string length)使用mallocreallocfree,但这些应该在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;
}