我在下面创建了一个代码,我需要跟踪数组,增加指向数组的指针,并在数组结束时停止。
我使用下面的代码进行了测试,显然在增加ptr
和打印*ptr
的1000次迭代之后,我得到0
作为值。
因此,数组的最后一个元素总是为0吗?如果动态创建数组长度(我不允许使用链接列表),如何告诉ptr停在最后一个元素?我担心,如果我使用下面的代码,有一天我会遇到printf i = 1000,它会返回我随机的内存位置(对于下面的代码,它不是真的,但是谁知道)..
#include <stdio.h>
int my_array[] = {1,23,17,4,-5,100};
int *ptr;
int main(void)
{
int i;
ptr = &my_array[0]; /* point our pointer to the first
element of the array */
printf("value of ptr is %d\n", *ptr);
for(i=0; i<1000; i++){
ptr++;
}
printf("value of ptr is now %d", *ptr);
return 0;
}
答案 0 :(得分:4)
这是真的,数组的最后一个元素总是“0”吗?
不,这只是纯粹的运气。您正在从内存中的随机位置进行阅读,甚至可能会出现分段错误,从而导致程序被终止。
您应始终确保不会读取/写入数组的边界,否则可能会发生非常糟糕的事情(分段错误可能是最不好的错误)。
您可以使用以下代码跟踪数组中的项目数:sizeof(my_array)/sizeof(int)
答案 1 :(得分:2)
不,您不能在数组末尾取消引用该元素;这是未定义的行为。
一种方法是注意阵列中有sizeof(my_array)/sizeof(my_array[0])
个元素。
答案 2 :(得分:2)
这是真的,数组的最后一个元素总是“0”吗?
不,你不幸的是代码没有破坏。
如果数组长度是动态创建的,那么如何告诉ptr停在最后一个元素
阵列无法实现。你需要知道数组的大小并迭代它。
答案 3 :(得分:1)
您需要通过传递其他参数来自行跟踪动态数组大小。对阵列后的内存无法保证。
0仅为字符串提供终止。
答案 4 :(得分:1)
由于内存管理从平台变为平台,我不会依赖于阵列后面有0的事实。
既然你是宣布阵列的人,你应该知道它有多长,所以你可以从技术上说:
for(i = 0; i < 6; i++)
如果您不知道数组的大小,可以使用sizeof运算符,如下所示:
// (sizeof my_array) will return the total size of the array in bytes
// (sizeof my_array[0]) will return the size of one element in bytes
// Dividing the two sizes in bytes will give you the total size.
int array_size = (sizeof my_array) / (sizeof my_array[0]);
for(i = 0; i < array_size; i++)
我的C ++有点生疏,但应该这样做:)
答案 5 :(得分:0)
你应该自己控制数组大小
sizeof(my_array)/sizeof(int)
您创建了包含6个元素的数组。通过访问您崩溃程序的数组的第7个元素(array[6]
)