如果我增加一个数组变量会发生什么呢?

What happens if I increment an array variable?

本文关键字:变量 什么 数组 一个 增加 如果      更新时间:2023-10-16

我知道改变指针的地址是不安全的,如果它放在堆上,因为稍后释放它会引起一些麻烦,但是如果指针在堆栈上声明,这样做是安全的吗?

我说的是这样的:

char arr[] = "one two three";
arr++;
//or arr--;

我希望我把char数组作为指针来引用是正确的

不能更改数组的地址。它将给出一个编译时错误。看一看:http://codepad.org/skBHMxU0

编辑:

你的评论让我明白了你的真实意图:比如:

char *ptr = "one two three";
ptr++;

没有问题。字符串"one two three"是一个常量,您可以自由地修改ptr,但请注意,您可能会在以后再次找到该字符串的开始时遇到麻烦…[但是内存泄漏不会发生]

作为一个经验法则,您负责使用malloc/new特别分配的内存,编译器负责其余部分。

如前所述,您的代码将无法工作,因为++的操作数必须是可修改的左值,而数组表达式是不可修改的左值。

可以做的是这样的:

char arr[] = "one two three";
char *ptr = arr;  // ptr points to the leading 'o'
...
ptr++; // ptr now points to 'n'

就安全性而言,如果增加或减少ptr的结果导致它指向数组之外的内存,则可能会遇到问题,访问或修改可能是安全的,也可能是不安全的。

一行:

char arr[] = "one two three";

创建一个数组(这意味着它的位置是固定的),它与指针不同,因为指针的位置是可以移动的。数组默认初始化为内容"一二三";你可以改变数组的内容,因为它的大小不会增长,但是你不能移动arr。

arr++;
因此

将是一个错误。但是,您可以这样做:

char* ptr = arr;
ptr++;

获取arr数组的第二个字符

不是指针所在的位置(堆或堆栈),而是指针所指向的内存所在的位置。

堆栈上的内存是自动清理的,你必须记住(保持指针指向)堆上的内存,因为清理它是你的责任。

不能增加数组变量/数组名称,但是可以使用数组名称/数组变量访问数组的任何元素。这就是为什么指针会出现在图片中。数组地址不可修改例如,

int k[3]={1,4,3};
printf("%d", *(k+1));  // compiles without any warning o/p is 4
printf("%d", *k++); //Will throw an error, Trying to modify an unmodifiable value
上面代码片段中的

,第2行:我们没有对数组变量加1,但是我们通过使用数组地址获取数组中第一个索引元素的值。

相关文章: