Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我要得到这些内存地址?_C_Pointers_Memory - Fatal编程技术网

C 为什么我要得到这些内存地址?

C 为什么我要得到这些内存地址?,c,pointers,memory,C,Pointers,Memory,我想知道为什么我会在这个简单的程序中得到这些内存地址 #include <stdio.h> int main() { char *a = "buffera"; char *b = "bufferbb"; printf("%p %p\n", a, b); return 0; } 假设每个字符在内存中占用一个字节(两个十六进制数),那么如果字符串a在内存中占用7+1=8字节,并且a的地址从0x00403064开始,那么根据我的说法,它应该在0x00

我想知道为什么我会在这个简单的程序中得到这些内存地址

#include <stdio.h>

int main() {
    char *a = "buffera";
    char *b = "bufferbb";

    printf("%p %p\n", a, b);

    return 0;
}

假设每个字符在内存中占用一个字节(两个十六进制数),那么如果字符串
a
在内存中占用7+1=8字节,并且
a
的地址从0x00403064开始,那么根据我的说法,它应该在0x00403079结束,而不是0x0040306B。

0043064+8=0040306C;我不知道你从哪里得到00403079;我不知道你从哪里得到00403079

0x00403064 + 0x8 == 0x0040306C
请注意,这些数字是十六进制的

但无论如何,虽然这些字符串不能重叠,但它们不需要在内存中彼此靠近

请注意,这些数字是十六进制的


但不管怎样,虽然这些字符串不能重叠,但它们不需要在内存中彼此靠近。

为什么您认为b会在a之后开始?为什么您认为b会在a之后开始?值得一提的是,b不一定会在a之后进入内存。在本例中,看起来是这样,但您不应该假设它。1字节=1十六进制?,但1十六进制表示一个半字节。。。半个字节,则不应在0x00到0x01之间占用1个字符,在0x00到0x03之间占用2个字符,依此类推?@icemanind:true,但它比任何其他特定位置更可能。@cursillosonline:No.
sizeof(char)==1
。所以
char[1]
占据
[0x00,0x01)
。而
char[2]
占据
[0x00,0x02)
。十六进制不代表任何东西。它是一种计数方法。你可以用十六进制数半字节,十六进制数字节,十六进制数单词,或者十六进制数天空中的星星数。大小是无关的。值得一提的是,b不一定会放在a之后的内存中。在这种情况下,看起来是这样,但你不应该假设它。1字节=1在十六进制?中,但1个十六进制代表一个半字节,那么不应该有1个字符从0x00到0x01,2个字符从0x00到0x03等等?@icemanind:true,但它比任何其他特定位置更可能。@cursillosonline:No.
sizeof(char)==1
。因此
char[1]
占据
[0x00,0x01)
。和
char[2]
占据
[0x00,0x02)
。十六进制并不代表任何东西。它是一种计数方法。你可以用十六进制数半字节、十六进制数字节、十六进制数单词或十六进制数天空中的星星数。大小无关
0x00403064 + 0x8 == 0x0040306C