我有一个malloced数组,我需要将其地址传递给另一个函数,以便它可以操作它.但是,看起来我的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);
}
Run Code Online (Sandbox Code Playgroud)
god*_*el9 10
1)您只有运算符优先级错误([]对于数组下标具有比*指针解除引用更高的优先级).添加一组额外的括号,你应该没问题:
printf("%d\n", (*ints)[1]);
Run Code Online (Sandbox Code Playgroud)
2)你正在分配3个字节的内存而不是3 * sizeof(int)(帽子提示:alk):
int *ints = malloc(3 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
要为分配内存int分配sizeof(int),有房3点int就做:
int * ints = malloc(3 * sizeof(*ints)); /* 3 times the size of what ints points to. */
Run Code Online (Sandbox Code Playgroud)
如果您不需要操纵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;
}
Run Code Online (Sandbox Code Playgroud)
好的,为了完整性:
如果您确实需要传递地址ints(根据您的示例),请注意[]运算符绑定比*运算符更严格,并执行:
void f(int ** pints)
{
printf("%d\n", (*pints)[1]);
}
Run Code Online (Sandbox Code Playgroud)
另外,传递数组元素的数量也是一个好主意,因为它不能从函数接收的指针中确定,如下所示:
#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;
}
Run Code Online (Sandbox Code Playgroud)