如果我增加一个数组变量会发生什么呢?
What happens if I increment an array variable?
我知道改变指针的地址是不安全的,如果它放在堆上,因为稍后释放它会引起一些麻烦,但是如果指针在堆栈上声明,这样做是安全的吗?
我说的是这样的:
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,但是我们通过使用数组地址获取数组中第一个索引元素的值。
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 未初始化的变量有什么危险
- 在C/C++中将变量名定义为__00000001有什么好处吗
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 存储变量的更有效方法是什么?
- 变量 BitMask 在函数 CeilLog2 中的实际效果是什么?
- 这个变量在 C++ 中的范围是什么?
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 变量按什么顺序相乘
- 与普通变量相比,仅仅读取原子变量的性能有什么不同吗
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- C++在变量的内存地址上做什么来"deallocate"它?
- 有什么方法可以使用 int 变量来完成组件名称吗?
- 从"LLONG_MAX 秒"构造 std::chrono::毫秒变量时发生了什么?
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- 正在连接的等待条件变量的线程会发生什么情况?
- 当使用Lua作为嵌入式语言(比如c++)时,有什么简单/方便的方法可以找到变量在Lua中的定义位置吗
- 什么是变量均值'int border = borderType & ~BORDER_ISOLATED'?