将内存分配给char * C语言

这是为char *分配内存的正确方法吗?

char* sides ="5"; char* tempSides; tempSides = (char*)malloc(strlen(inSides) * sizeof(char)); 

几乎。 字符串以NULL结尾,因此您可能希望分配一个额外的字节来存储NULL字节。 也就是说,即使side是1个字符长,它实际上是2个字节:{ 5'\0' }。

所以它会是:

 tempSides = (char *)malloc((strlen(sides)+1)*sizeof(char)); 

如果你想复制它:

 strcpy(tempSides, sides); 

注意:

  1. 字符串是零终止的(\ 0),而strlen()不计算它;
  2. 根据定义,sizeof(char)是1(字节),因此不需要;
  3. 如果使用C(而不是C ++)编译器,则无需将其char *char * ;

那就是:

 char *tempSides = malloc(strlen(inSides) + 1); 

但是,如果要复制 inSides的内容,可以使用strdup ,例如:

 char *tempSides = strdup(inSides); if (tempSides != NULL) { // do whatever you want... free(tempSides); } 

正如已经指出的那样,你错过了为终止NUL字符分配空间。 但我还想指出一些可以使您的代码更简洁的其他事情。

根据定义, sizeof(char)始终为1,因此您可以将分配行缩短为:

 tempSides = (char*)malloc(strlen(inSides) + 1); 

另一件事是,这看起来像你要复制字符串。 有一个内置function,为您做到这一点:

 tempSides = strdup(inSides); 

这样可以处理获取长度,分配正确的字节数和复制数据。

有一个问题。 tempSides将指向一个未初始化的大小为1的内存块。如果您打算将sides字符串复制到tempSides中,那么您需要分配一个字节长一个字节,以便保存字符串的零终止符。 strlen()返回的值不包括字符串末尾的零终止符。

不,不是真的。 正如其他人已经指出的那样,您需要为NUL终结器分配空间。

另外,您通常不应该从malloc回报。 它可以掩盖你忘记#include正确标题的错误。 乘以sizeof(char)也毫无意义,因为标准(C和C ++)将sizeof(char)定义为始终为1。

最后,每次调用malloc都应该包含对结果的测试。 我将整个事情包装成一个函数:

 char *dupe_string(char const *string) { char *temp; if (NULL!=(temp=malloc(strlen(string)+1))) strcpy(temp, string); return temp; } 

将元素数乘以sizeof(char)是个人偏好的问题,因为sizeof(char)始终为1.但是,如果为了保持一致性,最好使用收件人指针类型来确定元素大小,而不是指定类型明确。 并且不要转换malloc的结果

 tempSides = malloc(strlen(inSides) * sizeof *tempSides); 

当然,在使用以零结尾的字符串时,您必须记住为终止零字符分配额外的空间。 在这种情况下,没有办法说明你是否打算让tempSides成为一个以零结尾的字符串,所以我不能说你是否需要它。

将动态内存分配给tempSides的正确方法如下所示:

 char* sides ="5"; char* tempSides; tempSides = (char*)malloc((strlen(sides) + 1) * sizeof(char)); 

char*存储字符串数据,类似于char[] 。 字符串为null (\0)终止。 因此,应为null字符存储分配额外的一个字节。

动态分配的内存块必须在使用结束后使用free()释放。 如果没有释放,将发生内存泄漏。

 free(tempSides); 

一个内存被释放,必须分配NULL以防止它成为悬空指针。

 tempSides = NULL;