你能解释下面的代码吗?
str = (char *) malloc (sizeof(char) * (num+1));
malloc
在这做什么? num + 1
?答案 0 :(得分:29)
malloc
是一个函数that allocates a chunk of memory on the heap,并向其返回pointer。它与许多语言中的new
运算符类似。在这种情况下,它创建了一个内存块,可以在任意长度的时间内存活并具有任意大小。这本身就是相当深入的东西,这有点难以解释,并且需要另外提出一个问题。
num + 1
会补偿字符串末尾的null terminator。字符串通常需要知道它们有多长,C传统是在字符串末尾为一个额外字符分配空间,这将始终是特殊字符\0
。这允许处理字符串的函数自动确定字符串的大小。例如,如果你想对字符串的每个字符做一些事情而不知道字符串有多长,你可以这样做:
const char *ptr = str;
while (*ptr != '\0') {
process(*ptr);
ptr++;
}
答案 1 :(得分:13)
malloc
用于内存分配。
num + 1
允许使用null-terminator - \0
。
答案 2 :(得分:10)
序言:我简直不敢相信!当我被教授C基础知识(没有双关语)时,我被这种表达困惑不解。这就是我在“解析代码”部分中详细介绍的原因。
第一个问题是解析代码
str = (char *) malloc (sizeof(char) * (num+1));
使用C / C ++时,必须解析这种表达式,因此我们将其分解为其组件。我们在这里看到的第一件事就是:
variable = (expression) function (expression) ;
我第一次看到它时,我只是“嘿,我不敢相信有一种编程语言可以通过在函数调用的左侧和右侧放置它们的参数来调用函数!”。
事实上,这一行应该像:
variable = function_a (function_b (expression)) ;
其中:
expression is sizeof(char) * (num+1)
function_b is malloc
function_a is a cast operator
正如其他地方已经解释的那样,C风格的演员操作员更像是
(function_a) expression
比自然更
function_a(expression)
这解释了整行代码的陌生感。
请注意,在C ++中,您可以使用这两种表示法,但您应该使用static_cast,const_cast,reinterpret_cast或dynamic_cast而不是上述表示法。使用C ++强制转换,上面的代码行将是:
str = static_cast<char *> ( malloc (sizeof(char) * (num+1)) ) ;
sizeof是一个运营商。您可以将其视为处理类型的函数。 您将一个类型作为参数传递,它将以字节为单位给出它的大小。
所以,如果你写:
size_t i = sizeof(char) ;
size_t j = sizeof(int) ;
你可能(在32位Linux上)i的值为1,j的值为4。 它在malloc中的使用就像是说“我想要足够的空间放置25辆4米长的车”而不是“我想要至少100米”。
Malloc的参数是size_t,即无符号整数。你给它的大小以字节为单位,如果成功,它会返回足够大的分配内存地址,供你用作数组。例如:
int * p = (int *) malloc (25 * sizeof(int)) ;
然后p指向一个可以并排放置25个整数的内存,就像在索引从零到大小minux的数组中一样。例如:
p[0] = 42 ; // Ok, because it's the 1st item of the array
p[24] = 42 ; // Ok, because it's the 25th item of the array
p[25] = 42 ; // CORRUPTION ERROR, because you are trying to
// use the 26th item of a 25 items array !
注意:你也有指针算术,但这超出了问题的范围。
C风格的字符串与其他语言字符串有些不同。 字符串的每个字符都可以是任何值但不是零。 因为零(也标记为\ 0)标记c字符串的结尾。
换句话说:你永远不知道c字符串的大小,但是通过搜索\ 0字符,你可以知道它的结束位置(顺便说一下,这是缓冲区溢出和堆栈损坏的一个原因)。
例如,字符串“Hello”似乎有5个字符:
"Hello" seems to be an array containing 'H', 'e', 'l', 'l' and 'o'.
但事实上,它有6个字符,最后一个是字符ZERO,使用转义字符\ 0记录。因此:
"Hello" is an array containing 'H', 'e', 'l', 'l', 'o' and 0.
这解释了当你想为一串“num”字符分配足够的空间时,你会分配“num + 1”个字符。
答案 3 :(得分:7)
malloc 分配内存。
num + 1 ,num是字符串中的字符数,空终止符是+1
答案 4 :(得分:2)
在这种情况下,Malloc分配num + 1倍sizeof(char)字节。当您想要分配元素数组时,这是标准做法。 sizeof(char)中的char通常替换为正在分配的数组类型。
严格地说,在这个例子中,虽然sizeof(char)不是必需的。它被保证为C标准的大小为1,因此只乘以1。
答案 5 :(得分:1)
malloc在堆上分配一个char数组(在本例中)。
数组的长度为num + 1,但它可以容纳的最长字符串是'num'长,因为C中的字符串需要一个结尾的空字节。
答案 6 :(得分:1)
Malloc分配内存,在本例中为长度为num的字符串str。 (char *)是str的类型 sizeof(char)是每个字符所需的字节数。 +1表示字符串中的尾随空字符,通常为零。
答案 7 :(得分:0)
Malloc是一个分配内存的调用。
上面的代码将为num + 1个字符分配空间。可能有一个带有num个字符的字符串,代码的作者为null终止符添加了空格。
在调用str之后将指向已分配的内存块的开始。
答案 8 :(得分:0)
此代码尝试分配一块内存,该内存可以容纳char类型的num + 1值。因此,如果聊天等于一个字节且num为10,它将尝试分配11个字节的内存并返回指向该内存的指针。
+1可能是因为程序员想要存储num字符的字符串(字符数组)并需要额外的char来存储终止的'\ 0'(null)字符。在C / C ++中。按照惯例,chracater字符串以空字符结尾。
答案 9 :(得分:0)
malloc从堆中分配内存并返回指向它的指针。当你不知道编译时需要多少内存时,这很有用。
至于为什么(num + 1),它实际上取决于代码在做什么...可能num是字符串中的字符数,而+1是结尾的NUL终结符字节。但是,我不知道在这种情况下sizeof(char)会是什么。
答案 10 :(得分:0)
sizeof(char)
是安全的。不应该假设每个字符有一个字节。
我的问题是,如果你不知道malloc的作用,你在做什么编程?
man malloc
在Linux系统上。在Windows上。谁知道?点击鼠标可能只有17次。