带有malloc和strcpy代码的指针数组。如果valgrid-s不打印任何东西,那么这个代码有什么问题吗

我用malloc和strcpy编写了指针数组的简单代码

首先,我声明并定义了带有char*标记的指针数组[3];代币[0]=malloc(strlen(<html>)+1)然后printf和free此代码对memoryc是否安全

#包括<标准h>
#包括<malloc.h>
#包括<字符串.h>
字符*标记[3];
int main()
{
代币[0]=malloc(strlen(<html>)+1);
strcpy(标记[0],“html”;
printf("%s\n",标记[0]);
免费(代币[0]);
}

另外,请务必让我知道如何在数组令牌中一行分配三个指针我这样尝试过,但这不起作用

tokens[0]=malloc((strlen(<html>)+1)+(strlen(<title>)+1));

malloc.h是非标准且不推荐使用的,请改用stdlib.h。除此之外,代码为3个字符串中的第一个字符串分配空间看起来是正确的。(正如有人在评论中所说,您应该添加错误处理。)

另外,请让我知道如何在数组令牌中一行分配三个指针,我试着这样做,但这不起作用

使用指针数组而不是2D字符数组的全部意义在于,您可以为每个指向的字符串设置单独的字符串长度。所以,除非您有非常特殊的要求,否则在一行中分配房间没有多大意义。因此,这里的问题是为什么首先需要堆分配

假设您希望稍后替换字符串和realloc内存,那么您可以简单地用一些默认值初始化它们,如下所示:

常量字符*def[STR\N]=
{
&“html”;,
&“foo”;,
&“酒吧”;,
};
字符*标记[STR_N];
对于(大小i=0;i<STR\N;i++)
{
令牌[i]=malloc(strlen(def[i])+1);
strcpy(令牌[i],定义[i]);
“打印标记”;
}

另外,strdup目前被认为是有点不好的做法,因为它是非标准的,但看起来它将在即将到来的C2x中添加到标准中,因此它是另一个选项,而不是分两步执行分配+复制

发表评论