将内存分配给char * C语言

时间:2010-06-04 05:31:49

标签: c memory-management malloc

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

char* sides ="5";

char* tempSides;

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

7 个答案:

答案 0 :(得分:15)

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

所以它会是:

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

如果你想复制它:

strcpy(tempSides, sides);

答案 1 :(得分:9)

请注意:

  1. 字符串以零结尾(\ 0),而strlen()不计数;
  2. 根据定义,sizeof(char)是1(字节),因此不是必需的;
  3. 如果您使用C(而非C ++)编译器,则无需将其强制转换为char *;
  4. 那就是:

    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;