0
typedef struct {
  double x;
  double y;
  long out_x;
  long out_y;
} coords;

typedef struct {
  char name[FIGURE_LEN + 1];
  int coordcount, size_tracker;
  coords *coordinate;
} fig;

fig figure;
fig * figpoint;

これは、parser.c ソース ファイルから呼び出される関数です。

void initialize_fig(int n, char * name, double x, double y,
                         fig *fig_point)
{
  printf("inside function\n");
  strncpy(fig_point[n].name, name, FIGURE_LEN + 1);
  fig_point[n].size_tracker = 1;
  fig_point[n].coordinate = malloc(sizeof(coords) * fig_point[n].size_tracker);
  assert(fig_point[n].coordinate != NULL);
  fig_point[n].coordcount = 0;
  fig_point[n].coordinate[fig_point[n].coordcount].x = x;
  fig_point[n].coordinate[fig_point[n].coordcount].y = y;
}

void create_FigArray(fig * fig_point, int fig_size)
{
  fig_point = malloc(sizeof(fig) * fig_size);
  assert(fig_point != NULL);
  fig_point = &figure
}

私は最初に create_FigArray を呼び出します...

create_FigArray(fig_point, 16);

ここではセグフォルトは発生しません...しかし、電話をかけます...

initialize_fig(0, Qe, 10.0000, 10.0000, fig_point);

パラメータは実際には変数を介して渡されますが、それらが適切なパラメータであることを示し、渡される値の例を示したかっただけです。とにかく当たる

strncpy(fig_point[n].name, name, FIGURE_LEN + 1);

ここでセグメンテーション違反が発生するはずですが、なぜですか?!

これを回避する方法を助け、説明し、示してください。ありがとうございました。

4

3 に答える 3

1

メモリを割り当ててから、ポインタを変更します

fig_point = malloc(sizeof(fig) * fig_size); // allocate here
assert(fig_point != NULL);
fig_point = &figure;  // now you make fig_point point to something else

したがって、fig_pointポインタは動的に割り当てられたメモリを指しなくなります。次にこれを行う場合

fig_point[n]

figureは配列ではないため、メモリ out または range にアクセスしています。さらに、ポインタfig_pointcreate_FigArray直接渡します。これにより、ポインターのコピーが作成されるため、その引数に加えた変更は、実際にはcopy. これは、アドレスが返されたfig_array後に格納された動的メモリcreate_FigArrayが以前と同じであることを意味しcopyます。関数によって変更されたのは だけです。ポインターを変更したい場合は、関数へのダブルポインター引数を使用してから、次のようなものを使用する必要があります

void create_FigArray(fig** fig_point, int fig_size)
{
    *fig_point = malloc(sizeof(fig) * fig_size);
}
于 2012-11-04T22:12:29.107 に答える
1

わかりませんが:

まず、メモリを fig_point に割り当てます。

fig_point = malloc(sizeof(fig) * fig_size);

その後、図のアドレスを割り当てますが、それを行うべきではありません。

fig_point = &figure;

代わりにこれを行うことができます:

figure = *fig_point;
于 2012-11-04T22:13:14.343 に答える
1
  • これcreate_FigArrayを行うには: fig_point = malloc(sizeof(fig) * fig_size); そしてこれ: fig_point = &figure; //figure is a global variable and this causes a memory leak

  • 代わりに次のように書きます。

void create_FigArray(fig * fig_point, int fig_size)
{
  fig_point = malloc(sizeof(fig) * fig_size);
  assert(fig_point != NULL);
  fig_point = &figure;//Remove this line
}
  • 呼び出し元initialize_fig()またはどこかからの関数で、割り当てられたメモリを必ず解放してください。

  • すべてのポインタを NULL にしてから使用し、ポインタを扱う関数に NULL 引数チェックを追加し、NULL ポインタをチェックしてから使用します。

于 2012-11-04T22:25:14.387 に答える