我有一个小问题(很大)的c程序,并发现问题不是来自我的程序本身,而是我创建我的数组的方式,我认为。C - 数组值消失,而最后设置为空
我的问题是,我需要创建一个与包含环境变量(extern char **environ
)相同的数组,然后在最后添加另一个值。
这里是我做了检查,如果environ
很好复制或不是代码:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int ft_length(char **arr)
{
int i = 0;
while (arr[i])
i++;
return (i);
}
int main(void)
{
extern char **environ;
char **env;
int err;
int x;
err = 0;
x = 0;
env = (char**)malloc(sizeof(char*) * ft_length(environ) + 2);
while (environ[x])
{
// printf("%s\n", environ[x]);
env[x] = (char*)malloc(sizeof(char) * strlen(environ[x]) + 1);
bzero(env[x], strlen(environ[x]));
strncpy(env[x], environ[x], strlen(environ[x]));
// printf("%s\n", env[x]);
x++;
}
env[x] = (char*)malloc(sizeof(char) * 4);
env[x] = "ccc\0";
env[++x] = NULL;
x = 0;
while (environ[x])
{
if (strcmp(environ[x], env[x]) != 0)
{
err++;
printf("error on env[%d]\n", x);
printf("environ[%d] : |%s|\n", x, environ[x]);
printf("env[%d] : |%s|\n", x, env[x]);
printf("----------------\n");
}
x++;
}
while (env[x])
{
if (strcmp(env[x], "ccc") != 0)
{
err++;
printf("env[%d] contain |%s| instead of |ccc|\n", x, env[x]);
}
x++;
}
printf("done with %d error(s)\n", err);
return (1);
}
当我运行在Mac OSX上的代码,env[0]
是在结束空,这种情况发生当我设置最后一个数组值为NULL
(env[++x] = NULL
)。但是,如果我想在没有segfault的情况下打印我的数组,我需要这一个是NULL
。
因此,首先我想知道我的代码是否在某处出错?
我试着在我的Linux电脑上运行这段代码(Ubuntu 16.04),看起来没有问题。
“A * B + C”被解析为“(A * B)+ C”。 sizeof(char *)* ft_length(environ)+ 2'是没有意义的。 – melpomene
'env [x] =(char *)malloc(sizeof(char)* 4); env [x] =“ccc \ 0”;'泄漏内存。它不会做你认为它做的事情,并且如果它*做了*,那么对于越界访问将是未定义的行为。 – EOF
@melpomene哦,你是对的!我会尽快修复并重试。 – julien