在C中分配字符串的形式是正确的吗?
char *sample;
sample = malloc ( length * sizeof(char) );
或
sample = malloc ( length * sizeof(char*) );
char*
占用1个字节时,为什么char
占用4个字节?
答案 0 :(得分:6)
假设目标是存储一串length
个字符,正确的分配是:
sample = malloc(length + 1);
注意:
sizeof (char)
,因为它始终为1,不会添加任何值。length
是字符串可见字符的长度,即strlen()
的返回值为length
。malloc()
。 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));
它们在这里可能毫无意义,但除了将内存归零的微不足道的次要影响之外,calloc
与malloc
有明显的区别,它明确区分了对象,而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
是运算符,如&
或*
,而不是库函数;如果操作数是类型名称int
或char *
,则仅需要括号。
答案 8 :(得分:0)
请访问此链接https://www.codesdope.com/c-dynamic-memory/,以了解其如何在运行时动态分配内存。了解 malloc 的概念以及如何将内存量分配给该变量可能会有所帮助。
在您的示例中;
char *sample;
sample = malloc ( length * sizeof(char) );
在这里,您将声明一个指向字符的指针,而不声明其需要多少内存。在下一行中,为样本的地址分配了 length * sizeof(char)个字节内存,而(char *)将类型转换由malloc返回的字符转换为字符。