我知道更改指针的地址是不安全的,如果它放在堆上,因为以后释放会导致一些麻烦,但如果在堆栈上声明指针,这样做是否安全?
我正在谈论这样的事情:char arr[] = "one two three";
arr++;
//or arr--;
我希望通过引用char数组作为指针来实现这一点。
答案 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行:我们没有递增数组变量,但是我们使用数组地址获取数组中第一个索引元素的值。