malloc'ed数组的地址传递给函数 - seg错误

时间:2013-12-26 17:31:57

标签: c pointers

我有一个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);
}

4 个答案:

答案 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的答案进行了编辑以修复分配大小。我专注于引用计数:)