从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;
}
发生了什么事?
答案 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()
,它只会使本地指针指向新内存,并且在函数返回时会丢失引用。
存在两种可接受的技术,
检查是否已成功分配后,返回本地声明的指针。
values
将指针传递给指针本身并改变函数中的变量而不是指针值。
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;
}