使用malloc时出现分段错误

时间:2016-02-28 17:31:51

标签: c segmentation-fault malloc

我想我现在已经解决了所有问题。我犯了一个错误,就是增加environ变量,而不是把它当成一个数组并迭代它。以下是我现在所拥有的,应该是好的。

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& amp;这里的分段错误问题似乎与我的相同。话虽这么说,如果这是一个重复的问题,你会指导我解决方案吗?

大家好,我在使用malloc时遇到了问题。我编译并运行我的程序一次,malloc工作。然后我开始填写更多代码来解决问题,因为第一次运行我收到了分段错误。下面是我的代码在它的最后工作状态(尽管仍然给出了一个seg错误):

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);
}

该程序应该为char数组分配内存,然后根据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

我也试过在if语句之外调用malloc:

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

2 个答案:

答案 0 :(得分:3)

您要修改全局environ

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

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

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

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

这应该可以解决分段错误。

答案 1 :(得分:1)

有两件事:

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

您在这里分配n个字节。听起来你想为n的{​​{1}}指针分配空间,所以你应该替换为:

char

如果这确实是您尝试做的事情,那么malloc(n * sizeof(char *)) 应该是c,而不是char **,最好仍然是:

char *

顺便说一下,您似乎正在使用c = malloc(n * sizeof *c) 来完成两件完全不同的事情。通常最好不要使用变量 - 因为它会使您的程序更难理解 - 而是使用一个变量循环来打印您的环境变量,而使用另一个变量来存储动态分配的数组。 / p>

此外,如果c失败,则致电perror(),但是您只需继续执行您的程序,就好像没有错误一样。实际上,你应该在报告之后通过调用malloc()来回应这种性质的失败,如果没有其他的话。