0

簡単なコード スニペットを記述してポインターを学習しようとしています。今日は次のように書きました。

#include <stdio.h>
#include <stdlib.h>

void funcall1(int *arr_p, int *num_elements_p)
{
  int i = 0;
  *num_elements_p = 10;
  int *temp = (int *)malloc(10 * sizeof(int));
  if (temp != NULL)
  {
    arr_p = (int *)temp;
  }
  else
  {
      free(arr_p);
      printf("Error\n");
      return;
  }
  printf("\n------------------------funcall1------------------------------\n");
  for (i=0; i<(*num_elements_p); i++)
  {
      arr_p[i]= i;
      printf ("%d\t", arr_p[i]);
  }

}
int main()
{
  int *arr = NULL;
  int num_elements = 0;
  int i = 0;
  /*int *temp = (int *)malloc(10 * sizeof(int));
  if (temp != NULL)
  {
      arr = (int *)temp;
  }
  else
  {
      free(arr);
      printf("Error\n");
      return;
  }*/

  funcall1(arr, &num_elements);
  printf("\n------------------------Main------------------------------\n");
  for (i=0; i<num_elements; i++)
  {
    printf ("%d\t", arr[i]);
  }
  printf ("\n");
  free(arr);
  return 0;
}

メイン関数で malloc を使用すると、コードは期待どおりに機能します。しかし、呼び出された関数で使用すると、そうではなく、セグメンテーション違反が発生します。私は少し調べて、次のようないくつかの基本を理解しました。配列名は、実際には配列の最初の要素へのポインターです。したがって、パラメーターを正しく渡しています。2. 呼び出された関数でも配列を出力しているため、配列が更​​新されます。

arr_p は実際には arr が指している場所を指しているので、「arr_p = (int *)temp」を実行すると、arr もこの割り当てられたメモリ空間を指しているということではないでしょうか? メモリ内で何が起こっているのかを調べていますが、ここでメモリ アクセス違反が発生するのはなぜですか? 部分的に導き出された仮定で自分を納得させたくありません。

4

0 に答える 0