将内存分配给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);
注意:
- 字符串是零终止的(\ 0),而strlen()不计算它;
- 根据定义,sizeof(char)是1(字节),因此不需要;
- 如果使用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;