在 C 中操作字符串数组
Manipulation of arrays of strings in C
我正在用 C 编写一个基本的 shell(如在等待命令并在 UNIX 系统中执行它们的控制台程序中)副本,并且需要能够操作 char 的二维数组来存储环境变量。
我编写了一个小函数来创建该二维数组并将每个字符串初始化为 NULL
,然后再在我的代码中的其他地方填充它。
除了程序一启动就崩溃,不知为何。
我有类似的问题(即偶尔的段错误,可能是由于我 reading/writing 在不适当的地方)与其他两个函数,分别在需要时释放那些二维数组,并获得其中一个的长度那些二维数组。
如果我不使用这两个函数并在我的其余代码中 malloc 二维数组,除了最后一个条目为 NULL 之外没有初始化任何东西,而是直接在 malloc 之后复制 env 字符串,我有一些东西这样可行。但最好能够防止内存泄漏,并让 ft_tabnew 函数正常工作,以便我可以在未来的项目中重用它。
char **ft_tabnew(size_t size)
{
char **mem;
size_t i;
if (!(mem = (char **)malloc(size + 1)))
return (NULL);
i = 0;
while (i < size + 1)
{
mem[i] = NULL;
i++;
}
return (mem);
}
void ft_tabdel(char ***as)
{
int i;
int len;
if (as == NULL)
return ;
i = 0;
len = ft_tablen(*as);
while (i < len)
{
if (*as[i])
ft_strdel(&(*as[i]));
i++;
}
free(*as);
*as = NULL;
return ;
}
size_t ft_tablen(char **tab)
{
size_t i;
i = 0;
while (tab[i])
i++;
return (i);
}
注意:ft_tabdel 中使用的 ft_strdel 函数正在释放动态分配的字符串,并将指针设置为 NULL。我已经在几个项目中使用它几个月了,它还没有让我失望。
希望你们这些优秀的人能够告诉我我对二维字符数组有什么误解或误会,或者我在这里犯了什么愚蠢的错误。
谢谢。
您分配的资源不足 space。
if (!(mem = (char **)malloc(size + 1)))
只分配 size+1
字节。但是你需要为size+1
个指针分配space,而指针通常是4个字节。您需要将元素的数量乘以每个元素的大小:
if (!(mem = malloc((size + 1) * sizeof(*mem))))
代码中
char **mem;
while (i < size + 1)
{
mem[i] = NULL;
i++;
}
mem 是一个 "pointer to a pointer to a char",因此它的大小是指针的大小,而不是 char 的大小。当你说 mem[i] 和 incement i 时,你增加了指针的大小,而不是 char 的大小,因此覆盖了你分配的内存之外的内存。尝试:
if (!(mem = (char **)malloc((size + 1)*sizeof(void *))))
我正在用 C 编写一个基本的 shell(如在等待命令并在 UNIX 系统中执行它们的控制台程序中)副本,并且需要能够操作 char 的二维数组来存储环境变量。
我编写了一个小函数来创建该二维数组并将每个字符串初始化为 NULL
,然后再在我的代码中的其他地方填充它。
除了程序一启动就崩溃,不知为何。
我有类似的问题(即偶尔的段错误,可能是由于我 reading/writing 在不适当的地方)与其他两个函数,分别在需要时释放那些二维数组,并获得其中一个的长度那些二维数组。
如果我不使用这两个函数并在我的其余代码中 malloc 二维数组,除了最后一个条目为 NULL 之外没有初始化任何东西,而是直接在 malloc 之后复制 env 字符串,我有一些东西这样可行。但最好能够防止内存泄漏,并让 ft_tabnew 函数正常工作,以便我可以在未来的项目中重用它。
char **ft_tabnew(size_t size)
{
char **mem;
size_t i;
if (!(mem = (char **)malloc(size + 1)))
return (NULL);
i = 0;
while (i < size + 1)
{
mem[i] = NULL;
i++;
}
return (mem);
}
void ft_tabdel(char ***as)
{
int i;
int len;
if (as == NULL)
return ;
i = 0;
len = ft_tablen(*as);
while (i < len)
{
if (*as[i])
ft_strdel(&(*as[i]));
i++;
}
free(*as);
*as = NULL;
return ;
}
size_t ft_tablen(char **tab)
{
size_t i;
i = 0;
while (tab[i])
i++;
return (i);
}
注意:ft_tabdel 中使用的 ft_strdel 函数正在释放动态分配的字符串,并将指针设置为 NULL。我已经在几个项目中使用它几个月了,它还没有让我失望。
希望你们这些优秀的人能够告诉我我对二维字符数组有什么误解或误会,或者我在这里犯了什么愚蠢的错误。
谢谢。
您分配的资源不足 space。
if (!(mem = (char **)malloc(size + 1)))
只分配 size+1
字节。但是你需要为size+1
个指针分配space,而指针通常是4个字节。您需要将元素的数量乘以每个元素的大小:
if (!(mem = malloc((size + 1) * sizeof(*mem))))
代码中
char **mem;
while (i < size + 1)
{
mem[i] = NULL;
i++;
}
mem 是一个 "pointer to a pointer to a char",因此它的大小是指针的大小,而不是 char 的大小。当你说 mem[i] 和 incement i 时,你增加了指针的大小,而不是 char 的大小,因此覆盖了你分配的内存之外的内存。尝试:
if (!(mem = (char **)malloc((size + 1)*sizeof(void *))))