C编程指针、字节和内存分配有8题

C programming pointer, bytes and memory allocation have 8 question

我正在尝试获取字节和指针以及它们的存储方式任何人都可以解释或回答我的一些问题。谢谢

int num = 513;  <-- allocating a 4 bit memory by initializing
//[01][02][00][00] <-- (numbers are sorted and shown as litle endian)

char * ptr = &num; //char is (one byte)
   ↓
//[01][02][00][00] 
// pointer always start from the [0] (as in this array byte length) 
// in the allocated address in the memory ptr[0] is in this case = [01] 
// (printed as %x02 "printf("the byte %02x\n",ptr[0]);" - if it's only 
//single number 1 a zero will be added on the length so it prints out as 01)

int * ptr = &num; //now creating a pointer with the type of int (four bytes)
    ↓   ↓   ↓   ↓
//[01][02][00][00]

注意:char * ptr = &num; 实际上应该是 unsigned char * ptr = (unsigned char *)&num; 以避免编译器警告并确保字节被视为无符号值。

how can i access the first byte of this int pointer? [question01]

如果你真的想访问一个指针的第一个字节,你可以使用:

unsigned char *ptr2 = (unsigned char *)&ptr;

那么ptr2[0]就是指针的第一个字节ptr.

is there a way to see the bites inside the of the first byte([01])? [question02]

我假设您指的是第一个字节中的 。位不能直接寻址,因此您需要一个表达式(通常使用按位运算符)来获取每一位的值。例如,(ptr[m] >> n) & 1 将是对象的第 m 个字节的第 n 位的值(其中 ptr 是指向对象开头的 unsigned char *

where does the pointer save the address? does it have to allocate a memory space in the ram to save whe address such as 0x233828ff21 and if so this(0x233828ff21) address requires a lot of bytes? [question03]

地址在指针变量中的存储方式与数字在数值类型变量中的存储方式相同。在 CPU 指令级别,存储的指针值和存储的整数值之间没有区别,除了宽度。

指针类型的最典型大小是 8 个字节或 4 个字节,具体取决于编译器的目标体系结构。

(没有问题04.)

where does this int pointer stores it's type length (4bytes)? [question05]

它不存储类型的长度,但编译器知道 TYPE * 指向一个 sizeof(TYPE) 字节长的对象。

what happens if i declare a type with longer byte memory allocation such as long long * ptr = # [01][02][00][00][00][00][00][00] since i am pointing a long long to a 4 byte int, can those 4 last already been allocated by another program and in use? can i read it? [question06]

如果指针未针对引用类型正确对齐 (long long),则行为未定义。否则可以转换回原来的指针类型int *。在任何情况下,访问 *ptr 都会导致未定义的行为(除非 long longint 的宽度相同,这不典型)。

binary are only 0 and 1 and whether one of those(0 or 1) is called a bite? [question07]

它被称为。还有一种叫做_Bool的类型。 _Bool 类型的表达式始终具有值 0 或 1。

one byte is 8 bits right? why am i getting 16 bits 0000000000000001 when converting the number 1 in this website (https://www.rapidtables.com/convert/number/decimal-to-binary.html) shouldn't it be 8? [question08]

谁在乎一些随机网站显示的内容?

C 所说的“字节”是指 sizeof(type) 为 1 的任何类型,包括 charsigned charunsigned char。它至少 8 位宽,但在一些奇特的系统上比 8 位宽。

字符类型的指针(char *signed char *unsigned char *)可用于访问任何对象中的各个字节,但对于其他大小为 1 的类型,并且对于指向 _Bool (_Bool *)!

的指针肯定不正确

• how can i access the first byte of this int pointer? [question01]

一般来说,访问任意字节最好使用unsigned char而不是char,所以让我们这样做吧。

unsigned char *ptr = &num;之后,ptr是指向unsigned char的指针,你可以用*ptr或[=访问int的第一个字节17=],如 printf("The first byte, in hexadecimal, is 0x%02hhx.\n", *ptr);.

如果您有 int *ptr = &num;,则无法直接访问第一个字节。 ptr 这里是指向 int 的指针,要访问单个字节,您需要指向 unsigned char 或其他 single-byte 类型的指针。您可以将 ptr 转换为指向 unsigned char 的指针,与 (unsigned char *) ptr 一样,然后您可以使用 * (unsigned char *) ptr.

访问单个字节

• is there a way to see the bites inside the of the first byte([01])? [question02]

C 标准不提供显示字节的各个位的方法。通常程序员会像上面那样打印十六进制值,然后从十六进制数字中读取位。您也可以编写自己的例程来从一个字节写入二进制输出。

• where does the pointer save the address? does it have to allocate a memory space in the ram to save whe address such as 0x233828ff21 and if so this(0x233828ff21) address requires a lot of bytes? [question03]

指针和其他 intchar 变量一样是一个变量。它在存储其值的内存中有自己的 space。 (这种具有内存的变量模型用于指定 C 程序的行为。当程序被编译器优化时,它可能会改变这一点。)

在当前系统中,指针通常为 32 位或 64 位(四个或八个 8 位字节),具体取决于目标体系结构。您可以使用 printf("The size of a 'char *' is %zu bytes.\n", sizeof (char *)); 找出哪个。 (C 标准允许不同类型的指针具有不同的大小,但这在现代 C 实现中很少见。)

• where does this int pointer stores it's type length (4bytes)? [question05]

编译器知道指针的大小。指针本身不存储它指向的东西的长度。当您使用指针时,编译器会简单地生成适当的代码。如果用*ptr获取指针指向的值,如果ptr的类型是char *,编译器会生成load-byte指令,会生成一个ptr 类型的 load-four-byte 指令是 int * (并且 int 在您的 C 实现中是四个字节)。

• what happens if i declare a type with longer byte memory allocation such as long long * ptr = # [01][02][00][00][00][00][00][00] since i am pointing a long long to a 4 byte int, can those 4 last already been allocated by another program and in use? can i read it? [question06]

long long 是一个 eight-byte 整数,并且你有一个指向 four-byte 整数的 long long *ptr 时,C 标准没有定义行为您尝试使用 *ptr.

在general-purposemulti-user操作系统中,int之后的内存不能被另一个程序分配(除非这个程序和另一个程序都安排共享内存)。每个进程都有自己的虚拟地址space,并且它们的内存是分开的。

在您的程序中使用此 long long *ptr 可能会访问超出 int 的内存。这可能会在您的程序中导致各种类型的错误,包括损坏数据和对齐错误。

• binary are only 0 and 1 and whether one of those(0 or 1) is called a bite? [question07]

一个二进制数字是一个“位”。多个二进制数字是“位”。

特定计算机作为一个单位运行的最小位组是“字节”。一个字节的大小可以变化;早期的计算机有不同大小的字节。现代计算机几乎都使用 eight-bit 字节。

如果您的程序包含 header <limits.h>,它会定义一个名为 CHAR_BIT 的宏,它提供一个字节中的位数。在几乎所有现代 C 实现中都是八。

• one byte is 8 bits right? why am i getting 16 bits 0000000000000001 when converting the number 1 in this website (https://www.rapidtables.com/convert/number/decimal-to-binary.html) shouldn't it be 8? [question08]

网站不仅仅是转换为一个字节。

它似乎显示至少 16 位,从 16、32 或 64 位中选择该值适合的最小值作为有符号整数类型。