0

私はしばらくの間同じ問題を抱えていましたが、どれだけ調査しても頭を悩ませているようには見えません。なぜそれが起こっているのか、いくつかの理論を思いつきました。

基本的に、単純な C シェルを作成していますが、2 次元配列に格納するエイリアスを実装しようとすると、厄介なエラーが発生します。複数のエイリアスを配列に割り当てようとすると、最初の要素が上書きされます。

私はそれが下にあるかもしれないと思った:

  1. 入力を再度トークン化する際のメモリの問題
  2. 配列の「減衰」とポインタに関する問題
  3. 私のコンパイラは私を嫌っています。

これが私のコードです:

void fillArray(char* tokens[], char* aliasArray[ALIAS_NO][TOKEN_NUM]) {
    /* Integer for the for loop */
    int i;
    /* Counter for attribute addition */
    int counter = 2;
    /* Onto the search */
    for (i = 0; i < ALIAS_NO; i++) {
        if (aliasArray[i][0] == NULL) { /* If there is a space here */
            aliasArray[i][0] = tokens[counter-1]; /* Assign the alias */
            while (tokens[counter] != NULL) { /* While there is still stuff left */
                aliasArray[i][counter-1] = tokens[counter]; /* Add it in */
                counter++; /* Increment the counter */
            }
            return;
        }
    }
    return;
}

ALIAS_NO と TOKEN_NUM は、それぞれ値 10 と 50 のプリプロセッサ ディレクティブです。

このチェックは、i のステータスを出力し、多次元配列のすべての要素を NULL に初期化するときに、エントリが null かどうかを確認するために機能します。

どんな援助でも大歓迎です。あまりにも長い間、頭を壁にぶつけていました。

ありがとう :)

編集: strcpy() 関数も使用しようとしました。残念ながら、これはセグメンテーション違反をスローします。

編集: 新しいコード

 void fillArray(char* tokens[], char* aliasArray[ALIAS_NO][TOKEN_NUM]) {
/* Integer for the for loop */
int i;
/* Counter for attribute addition */
int counter = 2;
/* Buffer */
char buffer[200];
/* Onto the search */
for(i = 0; i < ALIAS_NO; i++) {
    if(aliasArray[i][0] == NULL) { /* If there is a space here */
        strcpy(buffer, tokens[counter-1]);
        aliasArray[i][0] = buffer; /* Assign the alias */
        while (tokens[counter] != NULL) { /* While there is still stuff left */
            strcpy(buffer, tokens[counter]);
            aliasArray[i][counter-1] = buffer; /* Add it in */
            counter++; /* Increment the counter */
        }
        return;
    }
}
return;
}
4

1 に答える 1

2
for(i = 0; i < ALIAS_NO; i++)
{
    if(aliasArray[i][0] == NULL)
    {
        aliasArray[i][0] = strdup(tokens[counter-1]);
        while (tokens[counter] != NULL)
        {
            aliasArray[i][counter-1] = strdup(tokens[counter]);
            counter++;
        }
        break;
    }
}
于 2013-03-14T22:31:34.453 に答える