如果我增加一个数组变量会怎么样?

时间:2011-09-07 13:26:27

标签: c++ c pointers stack heap

我知道更改指针的地址是不安全的,如果它放在堆上,因为以后释放会导致一些麻烦,但如果在堆栈上声明指针,这样做是否安全?

我正在谈论这样的事情:

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

我希望通过引用char数组作为指针来实现这一点。

5 个答案:

答案 0 :(得分:4)

您无法更改数组的地址。它会给出编译时错误。看看:http://codepad.org/skBHMxU0

修改 这些评论让我意识到你的真实意图: 类似的东西:

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

没有问题。字符串“一二三”是一个常量,你可以自由地修改ptr,但请注意你以后再找到这个字符串的开头会有麻烦... [但不会发生内存泄漏]

作为一个拇指规则,你负责使用malloc / new专门分配的内存,编译器负责其余部分。

答案 1 :(得分:3)

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

可以做的事情是这样的:

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

就安全性而言,如果递增或递减ptr的结果导致它指向阵列外部的内存,则可能仍会遇到问题,这可能是也可能不安全访问或修改。

答案 2 :(得分:2)

该行:

char arr[] = "one two three";

创建一个数组(这意味着它的位置是FIXED),它与指针的位置不同,因为指针位置可以移动。数组默认初始化,内容为“一二三”;您可以将数组的内容更改为日志,因为它不会增大,但您无法移动arr。

arr++;
因此,

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

char* ptr = arr;
ptr++;

到达arr数组的第二个字符。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

您不能增加数组变量/数组名称,但是您可以使用数组名称/数组变量访问数组的任何元素。这就是指针进入图片的原因。数组地址是不可修改的 例如,

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行:我们没有递增数组变量,但是我们使用数组地址获取数组中第一个索引元素的值。