这是为char *分配内存的正确方法。
char* sides ="5";
char* tempSides;
tempSides = (char*)malloc(strlen(inSides) * sizeof(char));
答案 0 :(得分:15)
几乎。字符串以NULL结尾,因此您可能希望分配一个额外的字节来存储NULL字节。也就是说,即使sides
长度为1个字符,它实际上也只有2个字节:{5
,'\0'
}。
所以它会是:
tempSides = (char *)malloc((strlen(sides)+1)*sizeof(char));
如果你想复制它:
strcpy(tempSides, sides);
答案 1 :(得分:9)
请注意:
char *
; 那就是:
char *tempSides = malloc(strlen(inSides) + 1);
但是,如果你想重复 inSides
的内容,你可以使用strdup
,例如:
char *tempSides = strdup(inSides);
if (tempSides != NULL) {
// do whatever you want...
free(tempSides);
}
答案 2 :(得分:3)
正如已经指出的那样,你错过了为终止NUL字符分配空间。但我还想指出一些其他可以使你的代码更简洁的东西。
根据定义,sizeof(char)
始终为1,因此您可以将分配行缩短为:
tempSides = (char*)malloc(strlen(inSides) + 1);
另一件事是,这看起来像你要复制字符串。有一个内置功能,为您做到这一点:
tempSides = strdup(inSides);
它处理获取长度,分配正确的字节数和复制数据。
答案 3 :(得分:1)
有一个问题。 tempSides将指向一个未初始化的大小为1的内存块。如果您打算将sides字符串复制到tempSides中,那么您需要分配一个字节长一个字节,以便保存字符串的零终止符。 strlen()返回的值不包括字符串末尾的零终止符。
答案 4 :(得分:1)
不,不是真的。正如其他人已经指出的那样,你需要为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;
}
答案 5 :(得分:0)
将元素数乘以sizeof(char)
是个人偏好的问题,因为sizeof(char)
始终为1.但是,如果为了保持一致性,最好使用收件人指针类型来确定元素大小而不是明确指定类型。并且不要投射malloc
tempSides = malloc(strlen(inSides) * sizeof *tempSides);
当然,使用零终止字符串时,您必须记住为终止零字符分配额外空间。在这种情况下,没有办法说明你是否打算让tempSides
成为以零结尾的字符串,所以我不能说你是否需要它。
答案 6 :(得分: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;