1

私は C が初めてで、このポインターとメモリ割り当てのすべてを完全には理解していません。概念的に間違っていたら申し訳ありません。文字列の配列内の文字列要素にアクセスしようとしていますが、文字列の配列は構造体にあり、それにアクセスしようとするたびにプログラムがクラッシュします。

この if ステートメント チェックを実行しようとすると、エラーが発生します

if (strcmp(functionList[holder].otherServers[i], "") == 0)

構造体の配列(functionList [holder])の現在の構造要素に、文字列の配列(otherServers [i])の要素に空の値が入力されているかどうかを確認したいだけです。そして、最初の空の要素が見つかったら、文字列の配列 (otherServers[i]) のそのインデックスに文字列をコピーするだけです。

そして、これが私のコードです(注:質問とは無関係だと思った多くのコードを取り出しました)

struct function {
    char name[20];
    int parameterNumer;
    int canDo;
    //currently the system has a 10 server max. You can change this easily
    char *otherServers[10];    
};

//global scope variables
//currently the system has a 10 server max. You can change this easily
char *serverList[10];
struct function functionList[10] = {{"",0, 0, {}}};
int numberofOtherServers;

while(strcmp(functionList[i].name, "") != 0 && i != -1)
{            
    //if the function exist in the functionList already, then just add server to the functions list of capable servers
    if(strcmp(functionList[i].name, functionName) == 0 && functionList[i].parameterNumer == functionParam)
    {
        holder = i;
        //function found so go through the functions list of servers and add it to the list
        i = 0;
        while(i >= 0)
        {
            if(strcmp(functionList[holder].otherServers[i], "") == 0)
            {
                strcpy(functionList[holder].otherServers[i], serverHelloName);
                i = -1; //
            }
            if(i == 9)
            { //ran through entire list of all possible servers and couldnt find an empty slot
                printf("server list full, should allow more room for other servers");
                fflush(stdout);
                i = -1;
            }
        }
        printf("yay");
        fflush(stdout);
    }
    if(i == 9)
    { //ran through entire list of all possible functions and did not see an empty slot or there is no match
        printf("function list full so could not add, and there was no match for any functions");
        fflush(stdout);
        i = -1;
    }
    i++;
}
4

2 に答える 2

1

あなたのコードは の割り当てを示していませんotherServers。のような文字ポインタの配列がある場合otherServersは、文字列ごとにメモリを割り当てて、何かを指すようにする必要があります。

strcmp()これは、これを行う前に有効な場所でポインターポイントを確認する必要があることを意味しますstrcpy()

if(strcmp(functionList[holder].otherServers[i], "") == 0) {
    strcpy(functionList[holder].otherServers[i], serverHelloName);
    i = -1;
}

代わりに、このスニペットはotherServers[i]まだ割り当てられていないことを確認し、文字列を格納するのに十分なメモリを割り当てます。

if ( functionList[holder].otherServers[i] == NULL ) {
    // add one for the terminator
    functionList[holder].otherServers[i] = malloc(strlen(serverHelloName) + 1);

    // make sure the allocation worked
    if ( functionList[holder].otherServers[i] == NULL ) {
        // something went wrong so bail
        break;
    }
    strcpy(functionList[holder].otherServers[i], serverHelloName);
}

otherServers[]or自体を使い終わったらfunctionList[]、以前に割り当てたメモリを解放する必要があります。

for ( i = 0; i < 10; i++ ) {

    if ( functionList[holder].otherServers[i] != NULL ) {
        free(functionList[holder].otherServers[i]);
        functionList[holder].otherServers[i] = NULL;
    }
}
于 2013-04-20T22:23:30.187 に答える
1

イニシャライザでは、単純な "" の代わりに NUL を配置することをお勧めします。

struct function functionList[10] = {{{'\0'},0, 0, {}}};

例の名前が割り当てられているかどうかを確認するには、それを逆参照して NUL 文字を確認します。

*functionList[i].name == '\0'

strcmp指定されたオフセットから始まるヌル文字 (別名ゼロターミネータ) をチェックし、見つからない場合は配列を超え続けます - このバッファがどのように使用されたかによっては、未定義の動作が発生し、ほとんどの場合アクセス違反が発生します。割り当てられます。

SpacedMonkey は有効な回答の残りの部分で私を打ち負かしました。文字列用のストレージを割り当てる必要があります。デフォルトでは、ポインタはメモリ内のある領域を指すだけです。malloc使用する前に手動で割り当て、 を使用して解放する必要がありますfree

于 2013-04-20T22:28:14.060 に答える