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

How to use `malloc` outside main()?

我从https://cs50.stackexchange.com/questions/4671/memory-allocation-recommended-practices读到"you don't have to declare all your pointers, allocate memory for them and/or free the allocated memory in main"。但是我,没有成功(执行returns 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;
}

怎么回事?

你需要有一个指向malloc()ed区域的指针,你可以模仿 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() 的本地参数并指向 return 值malloc()main() 不会改变你的 main()values,它只会使本地指针指向新内存,并且你在函数 return 时丢失了引用。

存在两种可接受的技术,

  1. Return检查分配成功后本地声明的指针。

    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;
    }
    
  2. 将指针传递给指针本身并更改函数中的变量而不是仅更改指针值。

    void gener_random(int size, int **values) {
        // Dereference the pointer to the pointer, to work
        // on the variable declared in `main()' (the original pointer)
        *values = malloc(size * sizeof(values));
        if (*values == NULL) // Perhaps reutnr `int' and error code
            return;
        for(int i = 0; i < size; i++)
            (*values)[i] = rand(); 
    }