如果我增加一个数组变量会怎么样?
我知道如果将指针的地址放在堆上是不安全的,因为以后释放它会导致一些麻烦,但如果在堆栈上声明指针,那么这样做是否安全?
我在谈论这样的事情:
char arr[] = "one two three"; arr++; //or arr--;
我希望通过引用char数组作为指针来实现这一点。
你不能改变数组的地址。 它会给出编译时错误。 看看: http : //codepad.org/skBHMxU0
编辑:
这些评论让我意识到你的真实意图:类似于:
char *ptr = "one two three"; ptr++;
它没有问题。 字符串“一二三”是一个常量,你可以自由地修改ptr
,但请注意你以后再找到这个字符串的开头可能有麻烦… [但不会发生内存泄漏]
作为一个拇指规则,您负责使用malloc / new专门分配的内存,编译器负责其余部分。
这条线:
char arr[] = "one two three";
创建一个数组(这意味着它的位置是固定的),它与指针的位置不同,因为指针位置可以移动。 该数组默认初始化,内容为“一二三”; 您可以将数组的内容更改为日志,因为它不会增大,但您无法移动arr。
arr++;
因此会出错。 但是,您可以这样做:
char* ptr = arr; ptr++;
到达arr数组的第二个字符。
如上所述,您的代码将无法工作,因为++
的操作数必须是可修改的左值,并且数组表达式不是可修改的左值。
你能做的是这样的:
char arr[] = "one two three"; char *ptr = arr; // ptr points to the leading 'o' ... ptr++; // ptr now points to 'n'
就安全性而言,如果增加或减少ptr
的结果导致它指向arrays外部的存储器,这可能会或可能不安全地访问或修改,则仍会遇到问题。
它不是指针所在的位置(堆或堆栈),而是指针指向的内存所在的位置。
堆栈中的内存会自动清理,您必须记住堆上的内存(保持指针),因为清理它是您的责任。
您不能递增数组变量/数组名称,但是您可以使用数组名称/数组变量访问数组的任何元素。 这就是指针进入图片的原因。 数组地址是不可修改的例如,
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行:我们没有递增数组变量,但是我们使用数组地址获取数组中第一个索引元素的值。