0

メインに関数があるとしますa:

a(c);

そしてc次のように宣言されています

char* c.

関数 a は実際には次のようになります。

void a(char* v)
{
    v[0] = 1;
    v[1] = 2;
}

これは間違っていますか?cプログラムは、この関数では初期化されていないと言っているためです。

編集:より多くのコード:

byte* msg;

insere_msg(t_msg, argv[2], msg);

void insere_msg(int size, char name[MAX], byte* v)
{
    FILE *fp;
    int i = 10;
    int n = 0;
    char aux;

    v[0] = (byte) 4;
    v[1] = (byte) 8;
    v[2] = (byte) 15;
    v[3] = (byte) 16;
    v[4] = (byte) 23;
    v[5] = (byte) 42;
    v[6] = (byte) size>>(3*8);
    v[7] = (byte) size>>(2*8);
    v[8] = (byte) size>>(1*8);
    v[9] = (byte) size;

    fp = fopen(name, "r");

    while(n < size)
    {
        fscanf(fp, "%c", &aux);
        v[i] = (byte) aux;
        i++;
        n++;
    }
}
4

1 に答える 1

0

あなたの編集を見てください: どこかで malloc コマンドを使用してメモリを割り当てる必要があります。

msg = (char *)malloc(sizeof(char) * atLeastThree);

msg が割り当てられたので、insere_msg 関数と a 関数にプッシュできます。

このより「安全な」コードも実装する必要があります。

void a(char * v, unsigned int sizeofV){
    if(NULL != v && sizeofV >= 3){
        v[0] = 1;
        v[2] = 2;
    }else{
        printf("array v is either not allocated or not of proper size");
    }
}

ポインターが指すデータを操作する前に、ポイント型が初期化されていること、および追求しようとしている関数の目的に対して有効であることを確認する必要があります!!!

現在、メモリを割り当てていない場合、これは問題を解決しません。単にエラーが発生しないようにするだけです。

EVEN SAFER コードが必要な場合は、未割り当てのポインターを渡し、関数を割り当ててサイズを返します。ここでの唯一のことは、呼び出し元がメモリの割り当てを解除する責任があるということです。

unsigned int a(char * v){

    v = (char *)malloc(sizeof(char) * Necessity);

    if(NULL != v){
        v[0] = 1;
        v[2] = 2;
    }else{
        printf("array v is either not allocated or not of proper size");
    }

    return Necessity;
}
于 2012-07-01T04:26:14.883 に答える