ndr*_*u96 3 c arrays c-strings memory-address
我正在对不同类型的字符串进行一些练习并返回它们的地址,以便我可以更好地理解指针运算的概念。
我注意到当使用 printf 函数和 %p 作为参考字符时,在变量上使用 & 操作数时地址会增加 4 + 1 个字节,没有它时增加 1 个字节。
这是我的代码示例及其输出:
1 #include <stdio.h>
2 #include <string.h>
3
4
5 int main ()
6 {
7 char charString_1[] = "Hello";
8 printf("%s\t%s\t %p\t %p\n", charString_1 + 1, charString_1 + 1, &charString_1 + 1, charString_1 + 1);
Run Code Online (Sandbox Code Playgroud)
输出如下
ello ello 0x7ffe76aba5d0 0x7ffe76aba5cb
仅查看最后两个十六进制数字,地址分别为 203 和 208(十进制)。所以后者是一个比前者大的 char + int 值。如果我增加 2 (&charString_1 + 2) ,现在差距是 2(char + int) = 10 字节。
我知道这个问题可能很荒谬,但我的搜索结果却一无所获。我试图了解内存是如何工作的,并更好地在有缺陷的代码中查找常见错误。
当您对指针进行算术运算时,“基本单位大小”是指向的对象的大小。
因此,对于char_string指向 a char(size = 1) 的 ,该+ 1操作仅添加一个。
但是,表达式&char_string求值作为一个指针到一个数组,其(在您的示例)的尺寸为6个字符(包括nul终止子),所以+ 1上操作该增加6。
您的两个%p字段 (5)打印的值的差异是这两个大小之间的差异 (6 - 1 = 5)。如果您更改数组的长度(例如,像char charString_1[] = "Hello, World!";),您将看到 的值发生相应的变化&charString_1 + 1。
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |