2010-06-04 129 views
7

是将内存分配给char *的正确方法吗?将内存分配给char * C语言

char* sides ="5"; 

char* tempSides; 

tempSides = (char*)malloc(strlen(inSides) * sizeof(char)); 
+0

@brickner这个怎么在strlen的, 的strlen(内部)+ 1 – boom 2010-06-04 05:58:48

回答

14

差不多。字符串是NULL终止的,所以你可能想分配一个额外的字节来存储NULL字节。也就是说,即使sides是1个字符长,但它确实是2个字节:{5,'\0'}。

因此,这将是:

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

,如果你想在复制:

strcpy(tempSides, sides); 
+8

你的意思是 '\ 0' 当你说NULL。 '\ 0'是nul,不是NULL。 – 2010-06-04 05:43:42

+0

请注意乘以sizeof(char)'是不必要的; 'sizeof(char)'被定义为1. – caf 2010-06-04 05:45:54

+2

@caf:是的,但省略它会使代码很难在必要时适应wchar_t或TCHAR - 如果没有乘法运算,就有可能忘记使用它。 – sharptooth 2010-06-04 05:50:20

1

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

1

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

另外,你一般应该而不是malloc投退。它可以掩盖你忘记了正确头部的错误。乘以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; 
} 
3

正如已经指出的那样,你错过了分配终止NUL chararacter空间。但我也想指出其他一些可以让你的代码更加简洁的东西。

根据定义,sizeof(char)始终为1,这样可以缩短你的配置行:

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

另一件事是,这看起来像你在做重复的字符串。有一个内置的功能,可以为你做到这一点:

tempSides = strdup(inSides); 

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

9

注意的是:

  1. 字符串是零结尾(\ 0),和strlen的()不进行计数;根据定义,sizeof(char)是1(字节),所以它不是必需的;
  2. 如果您使用C(而不是C++)编译器,则不需要将其转换为char *;

因此,这将是:

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

不过,如果你想复制的inSides的内容,你可以使用strdup,如:

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

乘以元素计数由sizeof(char)是个人喜好的问题,因为sizeof(char)总是1.但是,如果你这样做是为了一致性,最好使用t他是收件人指针类型来确定元素大小,而不是明确指定类型。而随着你要记住分配额外的空间用于终止零字符零结尾的字符串时不投malloc

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

当然的结果。在这种情况下,无法说明你是否打算使tempSides为零终止的字符串,所以我不能说你是否需要它。

+0

没办法?他最好在调用'strlen'时使用零终止字符串......如果他使用自己的strlen,那么我真的不想成为他后面的维护程序员。 ;) – Secure 2010-06-04 07:38:42

+1

@Secure:这只意味着'inSides'是零终止的。在代码中没有迹象表明'tempSides'也应该是零终止的。 – AnT 2010-06-04 07:43:19

0

分配动态存储器的正确的方法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;