1

C言語でアプリケーションを書いています。構造に基づいて新しいタイプを作成しました。

typedef struct ENTITY
{
    char * field1;
    char * field2;
} entity;

次に、エンティティの配列を動的に割り当てる関数を定義しました。

int my_function(entity ** my_array)
{
    count = random_int(1, 10);

    entity * result;
    result = (entity *) calloc(count, sizeof(entity));

    int i;
    for(i = 0 ; i < count ; i++)
    {
        (result+i)->field1 = strdup("Blabla in field1");
        (result+i)->field2 = strdup("Blabla in flied2");

        // This line print correctly "Blabla in field1" for each element in the array.
        printf("->{%s}\n", (result+i)->field1);
    }

    *my_array = result;
    return count;
}

メインファイルでは、次の関数を使用します。

entity * my_array;
count = my_function(&my_array);

for(i = 0 ; i < count ; i++)
{
    printf("field1 of the element %d: %s\n", i, my_array[i].field1);
}

何らかの理由で、このコードは、配列が <= 3 要素で満たされている場合に機能します。配列内の 4 つの要素から、セグメンテーション違反エラーが発生します。

->{Blabla in field1}
->{Blabla in field1}
->{Blabla in field1}
->{Blabla in field1}
field1 of the element 0: `�fZ$
Segmentation fault

ここで動的割り当てについて多くのことを読みましたが、この問題を解決することができません。どんな手掛かり?

助けてくれてありがとう!

4

1 に答える 1

1

以下に示すように、random_int() への呼び出しを削除し、それをハードコードされた量に置き換えると、コードが機能します。

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


typedef struct ENTITY
{
    char * field1;
    char * field2;
} entity;


int my_function(entity ** my_array)
{
    int count = 10;

    entity * result;
    result = (entity *) calloc(count, sizeof(entity));

    int i;
    for(i = 0 ; i < count ; i++)
    {
        (result+i)->field1 = strdup("Blabla in field1");
        (result+i)->field2 = strdup("Blabla in flied2");
    }

    for(i = 0 ; i < count ; i++)
    {
        // This line print correctly "Blabla in field1" for each element in the array.
        printf("->{%s}\n", (result+i)->field1);
    }    


    *my_array = result;
    return count;
}



int main( int argc, char *argv[] )
{
    int count;
    int i;

    entity * my_array;
    count = my_function(&my_array);

    for(i = 0 ; i < count ; i++)
    {
        printf("MAIN::field1 of the element %d: %s\n", i, my_array[i].field1);
        printf("MAIN::field2 of the element %d: %s\n", i, my_array[i].field2);
   }

    return( 0 );
}

これの出力は次のとおりです。

[root@jrn SO]# gcc  array.c
[root@jrn SO]# ./a.out 
->{Blabla in field1}
->{Blabla in field1}
->{Blabla in field1}
->{Blabla in field1}
->{Blabla in field1}
->{Blabla in field1}
->{Blabla in field1}
->{Blabla in field1}
->{Blabla in field1}
->{Blabla in field1}
MAIN::field1 of the element 0: Blabla in field1
MAIN::field2 of the element 0: Blabla in flied2
MAIN::field1 of the element 1: Blabla in field1
MAIN::field2 of the element 1: Blabla in flied2
MAIN::field1 of the element 2: Blabla in field1
MAIN::field2 of the element 2: Blabla in flied2
MAIN::field1 of the element 3: Blabla in field1
MAIN::field2 of the element 3: Blabla in flied2
MAIN::field1 of the element 4: Blabla in field1
MAIN::field2 of the element 4: Blabla in flied2
MAIN::field1 of the element 5: Blabla in field1
MAIN::field2 of the element 5: Blabla in flied2
MAIN::field1 of the element 6: Blabla in field1
MAIN::field2 of the element 6: Blabla in flied2
MAIN::field1 of the element 7: Blabla in field1
MAIN::field2 of the element 7: Blabla in flied2
MAIN::field1 of the element 8: Blabla in field1
MAIN::field2 of the element 8: Blabla in flied2
MAIN::field1 of the element 9: Blabla in field1
MAIN::field2 of the element 9: Blabla in flied2
于 2012-05-08T16:16:49.610 に答える