2016-02-28 128 views
1

我想我现在已经修好了一切。我犯了增加environ变量的错误,而不是像数组那样处理它并遍历它。以下是我现在拥有的,应该很好去。使用malloc时出现分割错误

extern char **environ; 

int main(int argc, char *argv[]) { 
    // determine number of environment variables 
    int n = 0; 
    char *c = NULL; 
    while ((c = environ[n++]) != NULL) { 
     printf("%s\n", c); 
    } 
    printf("%s\n%d\n\n", c, n); 

    // allocate array to store character pointers to environment array 
    char **new_c; 
    printf("This prints\n"); 
    if ((new_c = malloc(n * sizeof(*c))) == NULL) { 
     printf("Error\n"); 
     exit(EXIT_FAILURE); 
    } 
    printf("This prints now too\n"); 
    free(c); 

    // sort array of character pointers 

    // parse each environment variable and output 

    exit(0); 
} 

要开始,我已经通过几打的malloc阅读这里&段故障问题,并没有似乎是我的一样。这就是说,如果这是一个重复的问题,你会指点我的解决方案吗?

大家好,我有一个使用malloc的问题。我编译并运行了一次程序,malloc工作。然后我开始填充更多的代码来解决问题,并且自第一次运行以来,我收到了分段错误。下面是我在它的代码的最后工作状态(仍然给人一种赛格故障错误虽然):

extern char **environ; 

int main(int argc, char *argv[]) { 
    // determine number of environment variables 
    int n = 0; 
    char *c = *environ; 
    while ((c = *environ++) != NULL) { 
     n++; 
     printf("%s\n", c); 
    } 
    printf("%s\n%d\n\n", c, n); 

    // allocate array to store character pointers to environment array 
    printf("This prints\n"); 
    if ((c = malloc((size_t) n)) == NULL) { 
     perror("Unable to allocate memory\n"); 
    } 
    printf("This does not print\n"); 
    free(c); 

    // sort array of character pointers 

    // parse each environment variable and output 

    exit(0); 
} 

程序应该因为那时将用于进行排序,分析一个字符数组分配内存,并打印名称值或值名称对,具体取决于FORMAT值的设置。第一个循环工作并遍历environ变量并打印出每个名称 - 值对。我包括的两个printf语句陈述了我在终端中看到的内容。有没有人有任何想法我做错了?

另外,我还使用下面的malloc线尝试:

char *new_c = malloc((size_t) n); 
char *new_c = malloc(n); 
char *new_c = malloc(1); 
char *new_c = malloc(sizeof(n)); 
int *ptr = malloc((size_t) n); 

大概有几个人我试过,但我还是百思不得其解。有几行代码,我不知道如何在早期如何搞定任何东西。另外,笑声这里是我所得到的,当我在终端使用免费(显示我的可用内存):

   total  used  free  shared buff/cache available 
Mem:  3036836  1404340  902852  104712  729644  1491248 
Swap:    0   0   0 

我也打过电话以外的malloc if语句这样:

c = malloc((size_t) n); 
if (c == NULL) { 
    perror("Unable to allocate memory\n"); 
} 

回答

3

这里要修改的全球environ

while ((c = *environ++) != NULL) { 

while循环后,environ指向未初始化的内存。

malloc()寻找一些可以修改其行为的环境变量,并且现在取消引用一个指向未初始化内存的指针。 使用这个:

int i = 0; 
while ((c = environ[i++]) != NULL) { 

这应该修复分段错误。

+0

好,打电话,这是我接下来要处理的问题。现在我没有收到分段错误,但是此语句未打印出来: printf(“This does not print \ n”); – ZSButcher

+0

@ZSButcher嗯,它应该,我不明白为什么没有。你能显示完整的修改代码吗? – Ctx

+0

我错误地将if语句的条件更改为!=。现在一切似乎都在起作用。感谢您的好眼睛! – ZSButcher

1

两件事情是:

if ((c = malloc((size_t) n)) == NULL) { 
    perror("Unable to allocate memory\n"); 
} 

您分配n字节,在这里。这听起来像你想为n指针分配空间char,所以你应该替换为:

malloc(n * sizeof(char *)) 

如果这确实是你想要做什么,然后cchar **,不char *,更好地仍然是:

c = malloc(n * sizeof *c) 

顺便说一句,你似乎使用c两个完全不同的东西。通常最好不要用变量来做这件事 - 因为它会让你的程序更难理解 - 而是使用一个变量循环来打印你的环境变量,而另一个变量来存储你的动态分配的数组。

而且,你叫perror()如果malloc()失败,但你只是继续对上你的节目,就好像没有错误。实际上,如果没有其他人通过在报告后调用exit(EXIT_FAILURE),您应该回应这种性质的故障。

+0

将'n * sizeof(char *)'分配给'char *'。也许我错了,但我怀疑OP想要这个。 – ameyCU

+0

我刚刚用你的malloc替换了我的malloc,我仍然遇到了Segmentation Fault。我也把退出电话放在那里,谢谢你的注意。 – ZSButcher

+0

@ameyCU:好点,更新答案。 –