C内存分配 - char *和char sizeof

时间:2012-12-06 11:07:33

标签: c

在C中分配字符串的形式是正确的吗?

char *sample;

sample = malloc ( length * sizeof(char) );

sample = malloc ( length * sizeof(char*) );

char*占用1个字节时,为什么char占用4个字节?

9 个答案:

答案 0 :(得分:6)

假设目标是存储一串length个字符,正确的分配是:

sample = malloc(length + 1);

注意:

  1. 请勿使用sizeof (char),因为它始终为1,不会添加任何值。
  2. 记住终结符,我假设(基于名称)length是字符串可见字符的长度,即strlen()的返回值为length
  3. 我知道你没有,但值得指出的是,也不应该有cast of the return value from malloc()
  4. char *更大的原因是它是指针类型,指针几乎总是大于单个字符。在许多系统(例如你的系统)上,它们是32位,而字符只是8位。由于指针需要能够表示机器内存中的任何地址,因此需要更大的尺寸。在64位计算机上,指针通常是64位,即8个字符。

答案 1 :(得分:2)

  

当char占用1个字节时,为什么char *占用4个字节?

因为你在32位系统上,这意味着指针占用四个字节; char*是一个指针。

char始终只占用一个字节,因此您无需乘以sizeof(char)

sample = malloc (length);

我假设length已填充空终止。

答案 2 :(得分:1)

sample = malloc(length);

是正确的

char*是指针,指针使用4个字节(比如在32位平台上)

char是char,char使用1个字节

答案 3 :(得分:1)

sample = malloc ( length * sizeof(char) );

如果要为length个字符分配内存,首先是正确的。

char*是类型指针,在您的平台上恰好是4个字节。所以sizeof(char*)返回4.

但是sizeof(char)始终为1,并且C标准保证了smae。

答案 4 :(得分:1)

在给定的情况下,您正在做两件事:

在第一种情况下:sample = malloc ( length * sizeof(char) );

您正在分配length乘以{strong> 1字节类型char的大小

在第二种情况下:sample = malloc ( length * sizeof(char*) );

您正在分配length乘以指针大小char 4字节 在你的机器上。

考虑到案例1仍然是不可变的,在第二种情况下,大小是可变的。

答案 5 :(得分:1)

在您的情况下,您想要分配一个长度字符数组。您将在sample中存储一个指向length倍数组的指针。 sizeof(char*)是指向char的指针的大小。不是char的大小。

一个好的做法是

sample = malloc(length * sizeof(*sample));

使用它,您将保留您想要指向的长度的长度时间。这使您能够随时更改数据类型,只需将样本声明为另一种数据即可。

int *sample;

sample = malloc(length * sizeof(*sample)); // length * 4


char *sample;

sample = malloc(length * sizeof(*sample)); // length * 1

答案 6 :(得分:1)

如果length已经考虑了nul终结符,我会写:

sample = malloc(length);

或:

sample = malloc(length * sizeof(*sample));

sizeof(char*)是指针的大小,它与分配的缓冲区所需的大小完全无关。所以绝对不要使用它。

我的第一个片段是IMO,足以用于字符串操作代码。 C程序员知道C中的内存和字符串长度都是以sizeof(char)的倍数来衡量的。没有必要在每个人都知道的转换因子中1

我的第二个片段是一般编写分配的唯一方法。因此,如果您希望所有分配看起来一致,那么字符串分配也应该使用它。我可以想到两个可能的原因,使你的所有分配看起来都是一致的(IMO相当弱,但实际上并没有错):

  • 有些人会发现以这种方式阅读起来更容易,只能识别一种视觉模式。
  • 您可能希望将来使用该代码作为处理宽字符串的代码的基础,并且一致的表单会提醒您在length不再以字节为单位但在宽范围内进行测量时获得正确的分配字符。使用sizeof(*sample)作为一致形式意味着您根本不需要更改该行代码,假设您在sample的单位同时更新length的类型测量。

其他选项包括:

sample = calloc(length, 1);
sample = calloc(length, sizeof(char));
sample = calloc(length, sizeof(*sample));

它们在这里可能毫无意义,但除了将内存归零的微不足道的次要影响之外,callocmalloc有明显的区别,它明确区分了对象,而malloc只需要总大小。

答案 7 :(得分:0)

对于任何类型T,通常的形式是

T *p = malloc(N * sizeof *p);

T *p;
...
p = malloc(N * sizeof *p);

其中N是您希望分配的T类型的元素数。表达式*p的类型为T,因此sizeof *p等同于sizeof (T)

请注意,sizeof运算符,如&*,而不是库函数;如果操作数是类型名称intchar *,则仅需要括号。

答案 8 :(得分:0)

请访问此链接https://www.codesdope.com/c-dynamic-memory/,以了解其如何在运行时动态分配内存。了解 malloc 的概念以及如何将内存量分配给该变量可能会有所帮助。

在您的示例中;

char *sample;
sample = malloc ( length * sizeof(char) );

在这里,您将声明一个指向字符的指针,而不声明其需要多少内存。在下一行中,为样本的地址分配了 length * sizeof(char)个字节内存,而(char *)将类型转换由malloc返回的字符转换为字符。