0
4

4 に答える 4

0

&(erzeugeArr(5)) は厄介です。関数のアドレスを返すようです。しかし、左辺値が必要なエラーのため、C コンパイラは失敗します。

代わりに、次のことを試してください:-

struct IntArray *string,s1;

s1=erzeugeArr(5);
string = (struct IntArray *) &s1;  // If you really require pointer access
于 2013-05-25T15:53:46.087 に答える
0

ステートメントは式のstring = &(erzeugeArr(5));アドレスを取得しようとします (関数は型 の式を返しますstruct IntArray)。オブジェクトだけがアドレスを持ち、式はアドレスを持ちません。

于 2013-05-25T15:47:30.393 に答える
0

次のようなことができます。

struct IntArray
{
  int length;
  int *array;
}

struct IntArray *alloc_arr(int length)
{
  struct IntArray *erzeugt = calloc(sizeof(struct IntArray));
  erzeugt->length = length;
  erzeugt->array = calloc(length * sizeof(int));
  return erzeugt;
}

void free_arr(struct IntArray *p)
{
  free(p->array);
  free(p);
}

または、int の配列をインラインで格納するのに十分なサイズで構造体を割り当てる、少し卑劣なことを行うこともできます。

struct IntArray
{
  int length;
  int array[1];
}

struct IntArray *alloc_arr(int length)
{
  struct IntArray *erzeugt = calloc(sizeof(struct IntArray) + (length-1) * sizeof(int));
  erzeugt->length = length;
  return erzeugt;
}

void free_arr(struct IntArray *p)
{
  free(p);
}
于 2013-05-25T15:47:30.563 に答える
0

ローカル(構造体)変数のアドレスを返していると思いますが、後でそれを使用しようとすると、セグメンテーション違反(無効なアドレスにアクセスしようとしています)が発生します。

関数に構造体を動的に割り当てて返すことができます。

        struct IntArray* erzeugeArr(int length)
        {
            struct IntArray *erzeugt=(struct IntArray*)malloc(sizeof(struct IntArray*));
            erzeugt->array = (int*) malloc(sizeof (int)*length);
            return erzeugt;
        }

        int main()
        {
            struct IntArray *str;
            str=erzeugeArr(10);
            //use str for processing
        }
于 2013-05-25T15:42:32.053 に答える