C++ 如果我增加一个数组变量会发生什么?
我知道,如果指针放在堆上,那么更改它的地址是不安全的,因为以后释放它会引起一些麻烦,但是如果指针在堆栈上声明,那么这样做安全吗 我说的是这样的事情:C++ 如果我增加一个数组变量会发生什么?,c++,c,pointers,stack,heap,C++,C,Pointers,Stack,Heap,我知道,如果指针放在堆上,那么更改它的地址是不安全的,因为以后释放它会引起一些麻烦,但是如果指针在堆栈上声明,那么这样做安全吗 我说的是这样的事情: char arr[] = "one two three"; arr++; //or arr--; char arr[] = "one two three"; char *ptr = arr; // ptr points to the leading 'o' ... ptr++; // ptr now points to 'n' 我希望通过将字
char arr[] = "one two three";
arr++;
//or arr--;
char arr[] = "one two three";
char *ptr = arr; // ptr points to the leading 'o'
...
ptr++; // ptr now points to 'n'
我希望通过将字符数组作为指针来引用,我做到了这一点。不能更改数组的地址。它将给出一个编译时错误。看看: 编辑:
这些评论让我意识到了你的真实意图: 比如:
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";
arr++;
//or arr--;
char arr[] = "one two three";
char *ptr = arr; // ptr points to the leading 'o'
...
ptr++; // ptr now points to 'n'
就安全性而言,如果递增或递减
ptr
的结果导致它指向阵列外部的内存,则仍然可能会遇到问题,而访问或修改该内存可能安全,也可能不安全 不能增加数组变量/数组名称,但可以使用数组名称/数组变量访问数组的任何元素。这就是指针出现在图片中的原因,。数组地址是不可修改的
比如说,
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行:我们不是递增数组变量,而是使用数组地址获取数组中第一个索引元素的值 该指针不在堆栈上。将指针更改为动态分配的内存不会有任何固有的错误:
char*p=new char[100]++p
关键是您必须使用原始指针调用delete
,如delete p-1代码>这是一个维护噩梦,但并非天生无效。好吧,那么就一个字符*?这解决了代码示例,但没有回答问题。提问者甚至承认代码示例有问题。@Pilpel:我编辑了我的答案,一开始没有正确理解你。@amit但即使我们在做a++时声明char*a=“hai”或char a[]=“hai”;两种情况下我们都会丢失起始地址,对吗?两者有什么不同?