如何在 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 时丢失了引用。
存在两种可接受的技术,
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;
}
将指针传递给指针本身并更改函数中的变量而不是仅更改指针值。
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();
}
我从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 时丢失了引用。
存在两种可接受的技术,
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; }
将指针传递给指针本身并更改函数中的变量而不是仅更改指针值。
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(); }