内存中char指针的C字节

时间:2012-01-21 09:44:38

标签: c pointers allocation

我想计算一个char指针占用内存的字节数。 指针指向一个包含100个字符的字符串。

根据以下程序,char需要4个字节

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  char b;
  b = 'b';
  printf("%p\n",&b);

  system("pause");
  return 0;
}

指针是否相同? 因此,对于100个字符的字符串,它在内存中保存了400个字节?

8 个答案:

答案 0 :(得分:8)

char需要一个字节。指向任何东西的指针通常需要4或8个字节,具体取决于架构。当然,一个对象和指向它的指针是不同的东西,它们使用单​​独的内存,所以如果100-char字符串使用100或101字节(取决于你如何计算以及如何存储字符串),指向它的指针仍将使用4个字节。

答案 1 :(得分:4)

不,对于100个字符的字符串,您需要100个字节+ 1个字节用于&#39; \ 0&#39;字符串终止符。 您的程序返回4字节整数,因为您正在打印指向char的指针的值。 Char的大小为1个字节,不依赖于体系结构。指针的大小取决于体系结构,通常,32位arch为4字节,64位为8字节。

答案 2 :(得分:1)

您的程序打印为b分配的空间的内存地址。它与保留的内存量无关。

要查看指针在内存中占用的内存量,可以使用sizeof(void *)。这个值取决于系统,我想你的系统是4(32位)

但是,您无法获得指针所指向的已分配内存量(例如,通过malloc)。在一般情况下,您需要在分配期间存储它。在某些情况下,例如通过strdup()进行字符串复制,它将等于字符串+ 1的长度(对于结尾的'\ 0'字符。

答案 3 :(得分:1)

听起来好像你没有得到指针的概念与他们指出要清楚的东西 - 从公平起见这可能很棘手。

要尝试改写,指针是保存其他元素的地址或位置的东西。根据您运行的系统,指针本身所需的内存量会有所不同,但通常为4或8个字节。它与内存的使用是分开的,它可以是零,如果它是一个空指针,向上。 (顺便说一下,没有标准的方法来查找指针指向的大小,但这是另一个主题。)

无论如何,如果你有一个100个字符的字符串,你希望分配一个101个字符的缓冲区(作为一个习惯,允许空间并添加一个终止空值,以防万一你真的得到满100个字符),所以你的程序的内存使用量将是105或109字节的缓冲区和一个指向它的指针。

答案 4 :(得分:1)

char类型指针的大小为sizeof (int *)字节。

该值是实现定义的,但通常在32位系统中为4个字节,在64位系统中为8个字节。要在系统上打印尺寸,您可以执行以下操作:

printf("%zu\n", sizeof (char *));

char类型的大小始终为1个字节。

字符串的大小为sizeof the_string_array_object个字节。例如,字符串"Hello world!"的大小为sizeof "Hello world!"个字节。它是字符串中包含尾随空字符的字符数。

答案 5 :(得分:0)

通常char为1个字节,由C和C ++标准保证。

答案 6 :(得分:0)

你怎么想:

  

根据以下程序,char需要4个字节

首先,你的编译器应该在编译时产生警告,你的printf需要int值,你传递char*。使用sizeof()确定任何类型的内存占用量。

答案 7 :(得分:0)

指针是内存位置的地址。 100字节的字符串占用100个内存位置。因为它们是连续的,所以您可以使用单个指针引用该字符串,但它仍占用100个内存位置。

如果这是一条街道,那么这个字符串类似于一排房子,每个房子都有一个单独的地址,但你可以用街道名称来引用它们;这类似于引用一串位置的字符串名称或指针,而不是一个单独的位置。然而街道仍占据同一个空间!

这种情况下的指针是4个字节,因为32位处理器使用32位地址,因此它可以处理2个 32 离散存储器位置(4Gb)。