如何在main()外面使用`malloc`?

时间:2018-04-24 10:56:49

标签: c memory-management memory-leaks malloc cs50

https://cs50.stackexchange.com/questions/4671/memory-allocation-recommended-practices我读到“你不必声明所有指针,为它们分配内存和/或释放主要分配的内存”。但是,我没有成功(执行返回Segmentation fault: 11),尝试了:

#include <stdio.h>
#include <stdlib.h>
void gener_random(int size, int *values) {
    values = malloc(size * sizeof(values));
    for(int i = 0; i < size; i++)
        values[i] = rand(); 
}
int main(int argc, char **argv) {
    int size = 10;
    int *values;
    gener_random(size, values);
    for(long i = 0; i < size; i++)
        printf(" %d", values[i]);
    return 0;
}

相反,在malloc内移动main有效:

void gener_random(int size, int *values) {
    for(int i = 0; i < size; i++)
        values[i] = rand(); 
}
int main(int argc, char **argv) {
    int size = 10;
    int *values;
    values = malloc(size * sizeof(values));
    gener_random(size, values);
    for(long i = 0; i < size; i++)
        printf(" %d", values[i]);
    return 0;
}

发生了什么事?

1 个答案:

答案 0 :(得分:2)

你需要有一个指向malloc()区域的指针,你可以模仿 malloc()这样的行为

int *gener_random(int size) {
    int *values = malloc(size * sizeof(values));
    for(int i = 0; i < size; i++)
        values[i] = rand(); 
    return values;
}

您的代码无法正常工作的原因主要在Stack Overflow上讨论,您的int *value参数在gener_random()的本地参数,并使其指向{{1}的返回值}}不会更改malloc() main(),它只会使本地指针指向新内存,并且在函数返回时会丢失引用。

存在两种可接受的技术,

  1. 检查是否已成功分配后,返回本地声明的指针。

    values
  2. 将指针传递给指针本身并改变函数中的变量而不是指针值。

    int *gener_random(int size) {
        int *values = malloc(size * sizeof(values));
        if (values == NULL)
            return NULL;
        for(int i = 0; i < size; i++)
            values[i] = rand(); 
        return values;
    }