如何使用int 0和'\ 0'的c ++数组

jam*_*ick -2 c++ arrays

我使用的是c ++整数数组(int*).我生成了数字集并将其放入此数组中,例如1, 0, 3, 4, 5.该方法为该数组分配了16个字符

int *arr = (int *)malloc(16). 
Run Code Online (Sandbox Code Playgroud)

我需要能够遍历这个数组并使用每个数字并告诉数组中有多少个数字.为了遍历数组中的每个元素,我尝试了两种方法:

for(int i=0;i<sizeof(arr);i++) and for(int i=0;arr[i]!='\0';i++). 
Run Code Online (Sandbox Code Playgroud)

第一种方法的问题是sizeof返回16,因为我为该数组分配了多少空间.除非0序列中有a ,否则第二种方法是成功的.我应该如何循环遍历数组中的每个元素而不会卡住0或循环遍历所有16插槽?

Lig*_*ica 7

由于您已经为此"数组"(内存块)使用了动态分配,因此类型系统不知道该数组的维度.这意味着你不能使用sizeof(arr).你在那里所做的就是找到你的int*(指针)的大小.

并且,正如您所发现的那样,尝试对此数组进行null终止是完全愚蠢的,因为它0是一个完全有效的,理智的整数值.

应该做的是以下之一:

选项1

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
Run Code Online (Sandbox Code Playgroud)

选项2

std::vector<int> vec(16);
for (auto myInt : vec) {
   // ...
}

// here, the wrapper called "vector" knows its own size
Run Code Online (Sandbox Code Playgroud)

选项2a

如果您只是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) {
   // ...
}
Run Code Online (Sandbox Code Playgroud)

选项3

如果该值16不依赖于用户输入或其他运行时数据,请忽略动态分配:

std::array<int, 16> arr;
for (auto myInt : arr) {
   // ...
}
Run Code Online (Sandbox Code Playgroud)

或者,去老派:

int arr[16];
for (auto myInt : arr) {
   // ...
}
Run Code Online (Sandbox Code Playgroud)

结论

很难说你想要做什么,但我认为你试图拥有一堆数组元素,并非所有这些都可以在任何时候"使用",并以某种方式标记"未使用"的元素.在这种情况下,您希望放弃那种过时的逻辑,并使用上面的选项2a.

Bootnote

我在这里使用了一些C++ 11结构,即std::arrayranged-for循环.根据需要用更常规的等效物替换环.