我使用的是c ++整数数组(int *)。我生成了数字集并将其放入此数组中,例如1, 0, 3, 4, 5
。该方法
int *arr = (int *)malloc(16).
我需要能够遍历这个数组并使用每个数字并告诉数组中有多少个数字。为了遍历数组中的每个元素,我尝试了两种方法:
for(int i=0;i<sizeof(arr);i++) and for(int i=0;arr[i]!='\0';i++).
第一种方法的问题是sizeof
返回16
,因为我为该数组分配了多少空间。第二种方法是成功的,除非序列中有0
。我应该如何循环遍历数组中的每个元素,而不会卡在0
上或循环遍历所有16
个广告位?
答案 0 :(得分:7)
由于您已为此“数组”(内存块)使用了动态分配,因此类型系统不知道该数组的维度。这意味着您无法使用sizeof(arr)
。你所做的就是找到int*
(一个指针)的大小。
而且,正如您所发现的那样,尝试空终止此数组是完全愚蠢的,因为0
是一个完全有效的,理智的整数值。
应该做的是以下之一:
const unsigned int LENGTH = 16;
int* ptr = new int[LENGTH]; // (malloc is an ancient approach from C)
for (unsigned int i = 0; i < LENGTH; i++) {
// ...
}
delete[] ptr;
// here, I've remembered the block's size myself
std::vector<int> vec(16);
for (auto myInt : vec) {
// ...
}
// here, the wrapper called "vector" knows its own size
如果您只是随意挑选16
以提供最大上限,而总是需要16个元素:
std::vector<int> vec; // this grows as needed
vec.push_back(1);
vec.push_back(0);
vec.push_back(3);
for (auto myInt : vec) {
// ...
}
如果值16
不依赖于用户输入或其他运行时数据,请忽略动态分配:
std::array<int, 16> arr;
for (auto myInt : arr) {
// ...
}
或者,去老派:
int arr[16];
for (auto myInt : arr) {
// ...
}
很难说你想要做什么,但我认为你正试图拥有一堆数组元素,而不是所有这些元素都可以在任何时候被“使用”,并以某种方式标记“未使用”的。在这种情况下,您要放弃旧式逻辑,并使用上面的选项2a 。
我在这里使用了一些C ++ 11结构,即std::array
和ranged-for循环。根据需要用更常规的等效物替换环。
答案 1 :(得分:3)
sizeof
以字节为单位返回类型大小,不是数组的长度。因此,要使方法#1起作用,您必须存储数组的长度。
答案 2 :(得分:2)
您应该使用countof
代替sizeof
:
template <typename T, size_t N> size_t countof( T (&array)[N] ){return N;}
我不确切知道它为什么会起作用(我的意思是如果我放松它我不知道如何写它)但我使用它(我会尝试理解它 - 现在!)
我更了解如何解释的另一种方法是使用
sizeof(arr)/sizeof(int)
。
尽可能避免使用“特殊情况”值。总会造成问题。
答案 3 :(得分:2)
已经写了一些非常好的答案,但我只是想添加一个丑陋的答案:
如果你想以你编写的方式想要数组的大小
int *arr = (int*)malloc(16);
大小取决于系统中int的大小,可能是每个int 4个字节,因此最多4个int适合。为了跟踪你分配的大小,你需要手动输入分配块中的大小,例如
int n = 4;
int *arr = (int*)malloc((n+1)*sizeof(int));
*arr = 4;
然后移动指针
++arr;
无论何时需要大小,请检查*(arr-1)
当您释放该区块时,请务必使用free(arr-1)
最好将它们包裹在某种功能中以隐藏丑陋。
我确实不建议使用此方法,因为您使用C ++编程,避免使用malloc/free
,因为它们不是很兼容C ++,即它们对构造函数一无所知,而是使用{{1另外new/new[]/delete/delete[]
是我最喜欢的模板之一,一旦你知道如何使用这些数组将是轻而易举的。