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

Flo*_*ine 1 c pointers

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


alk*_*alk 5

要为分配内存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)