我有一个malloc
ed数组,我需要将其地址传递给另一个函数,以便它可以操作它。但是,看起来我的C生锈了。
以下是重现此问题的最小代码:
#include <stdio.h>
#include <stdlib.h>
void f(int **ints)
{
printf("%d\n", *ints[1]);
}
int main()
{
int *ints = malloc(3);
ints[0] = 's';
ints[1] = 't';
ints[2] = 'a';
f(&ints);
exit(EXIT_SUCCESS);
}
答案 0 :(得分:11)
1)您只有运算符优先级错误(对于指针解除引用,数组下标的[]
优先于*
。添加一组额外的括号,你应该没问题:
printf("%d\n", (*ints)[1]);
2)你正在分配3个字节的内存而不是3 * sizeof(int)
(帽子提示:alk):
int *ints = malloc(3 * sizeof(int));
答案 1 :(得分:5)
要为int
分配sizeof(int)
分配内存,为3 int
做空间:
int * ints = malloc(3 * sizeof(*ints)); /* 3 times the size of what ints points to. */
如果您不需要操纵ints
本身的值,您可以直接传递数组:
#include <stdlib.h>
#include <stdio.h>
void f(int * ints)
{
printf("%d\n", ints[1]);
}
int main(void)
{
int * ints = malloc(3 * sizeof(*ints));
ints[0] = 's';
ints[1] = 't';
ints[2] = 'a';
f(ints);
return 0;
}
好的,为了完整性:
如果您确实需要传递ints
的地址(根据您的示例),请注意[]
运算符绑定比*
运算符更紧密,并执行以下操作:
void f(int ** pints)
{
printf("%d\n", (*pints)[1]);
}
同样最好传递数组元素的数量,因为它不能从函数接收的指针中确定,如下所示:
#include <stdlib.h>
#include <stdio.h>
void f(int * ints, size_t n)
{
for (size_t i = 0; i < n; ++i)
{
printf("ints[%zu] = %d\n", i, ints[i]);
}
}
int main(void)
{
int * ints = malloc(3 * sizeof(*ints));
ints[0] = 's';
ints[1] = 't';
ints[2] = 'a';
f(ints, 3);
return 0;
}
答案 2 :(得分:2)
这应该有效:
printf("%d\n", (*ints)[1]);
答案 3 :(得分:2)
除了godel9的答案,你不需要传递存储数组地址的变量的地址;你只需要传递数组的地址。
#include <stdio.h>
#include <stdlib.h>
void f(int *ints)
{
printf("%d\n", ints[1]);
}
int main()
{
int *ints = malloc(3*sizeof(int));
ints[0] = 's';
ints[1] = 't';
ints[2] = 'a';
f(ints);
exit(EXIT_SUCCESS);
}
&ints
给出堆栈上代表int *ints
变量的4/8字节内存的地址。
编辑: 我根据godel9 / alk的答案进行了编辑以修复分配大小。我专注于引用计数:)