这是我如何malloc一个int var然后在函数
之外访问这个varint f1(int ** b) {
*b = malloc(sizeof(int));
**b = 5;
}
int main() {
int * a;
f1(&a);
printf("%d\n", *a);
// keep it clean :
free(a);
return 0;
}
使用上面的相同逻辑,我如何在函数内对一个1 dim数组进行malloc,然后在func之外访问它?
请帮助,我对指向数组的指针感到困惑。
答案 0 :(得分:12)
以完全相同的方式,但有一些不同的算术。您可以考虑使用一个元素分配数组时现在正在做什么。只需将sizeof(int)
乘以您希望数组所拥有的元素数量:
int f1(int ** b, int arrsize) {
*b = malloc(sizeof(int) * arrsize);
// then to assign items:
(*b)[0] = 0;
(*b)[1] = 1;
// etc, or you can do it in a loop
}
int main() {
int * a, i;
int size = 20;
f1(&a, size); // array of 20 ints
for (i = 0; i < size; ++i)
printf("%d\n", a[i]); // a[i] is the same as *(a + i)
// so a[0] is the same as *a
// keep it clean :
free(a);
return 0;
}
答案 1 :(得分:2)
你几乎就在那里*b = malloc(sizeof(int));
为一个int分配空间(因为指针至少与此一样大,所以有点无意义)
更正常的用法是*b = malloc(number_of_ints*sizeof(int));
请记住,[]
语法只是为你做了数组数学(a+10)
和a[10]
指向完全相同的内存位置,所以你可以使用malloc分配它,传递poitner并将其称为数组。
复杂的数组和指针的唯一内容(除了记住何时使用*和&amp;)是malloc()以字节为单位工作,所以你需要告诉它int的大小。但它返回的int *
知道有关int的内容,因此要获得下一个值,您只需要执行a++
或a+1
或a[1]
,即使它实际上是4或8个字节价值不同。
答案 2 :(得分:1)
(未经测试,但我相信它会起作用)
int f1(int ** b) {
*b = malloc(sizeof(int)*4);
(*b)[0] = 5;
(*b)[1] = 6;
(*b)[2] = 7;
(*b)[3] = 8;
}
int main() {
int * a;
f1(&a);
printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]); // should be "5 6 7 8"
// keep it clean :
free(a);
return 0;
}
答案 3 :(得分:0)
而不是malloc()
一个int,malloc
数组。
int f1(int * b) {
b = malloc(ARRAY_LENGTH * sizeof(int));
*b = 5;
b[1] = 6;
*(b + 2) = 7;
}
答案 4 :(得分:0)
您需要使用calloc
来代替malloc
(请参阅:http://www.manpagez.com/man/3/calloc/)