簡體   English   中英

傳遞給函數的malloc數組的地址-段錯誤

[英]Address of malloc'ed array passed to function - seg fault

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

1)您只是將運算符的優先級錯誤(對於數組下標, []的優先級比*的指針取消優先級高)。 添加額外的一組括號,就可以了:

printf("%d\n", (*ints)[1]);

2)您要分配3個字節的內存,而不是3 * sizeof(int) (帽子提示:alk):

int *ints = malloc(3 * sizeof(int));

要為分配內存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;
}

這應該工作:

printf("%d\n", (*ints)[1]);

除了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的答案進行了修改以固定分配大小。我專注於參考計數:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM