首页 > 解决方案 > 带有 malloc 和 strcpy 代码的指针数组。如果 valgrid -s 不打印任何东西,这段代码有什么问题吗

问题描述

我有这个带有 malloc 和 strcpy 的指针数组的简单代码。

首先,我用 printf 和 free 声明并定义了指针数组,char *tokens[3]; tokens[0]=malloc(strlen("<html>")+1);这段代码对 memoryc 泄漏是安全的吗

#include <stdio.h>
#include <malloc.h>
#include <string.h>

char *tokens[3];

int main()
{
    tokens[0]=malloc(strlen("<html>")+1);
    strcpy(tokens[0],"<html>");
    
    printf("%s\n",tokens[0]);
    free(tokens[0]);

}

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

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

标签: c

解决方案


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

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

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

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

const char* def[STR_N] =
{
  "<html>",
  "<foo>",
  "<bar>",
};
char *tokens[STR_N];

for(size_t i=0; i<STR_N; i++)
{
  tokens[i] = malloc(strlen(def[i])+1);
  strcpy(tokens[i],def[i]);
  printf("%s\n",tokens[i]);
}

由于它是非标准的,因此目前也strdup被认为有些不好的做法,但看起来它将在即将到来的 C2x 中添加到标准中,因此这是另一种选择,而不是分两步进行分配 + 复制。


推荐阅读