0

私はまだ C の初心者で、2 次元の char 配列を空にしようとしています。宣言は次のとおりです。

char arg_array = (char**)calloc(strlen(buf), sizeof (char**));
for(i = 0; i<(strlen(buf)); i++)
{
    arg_array[i] = (char*) calloc (strlen(buf), sizeof(char*));
}

ここで私はそれを空にしようとしています:

void make_empty(char **arg_array)
{
     int i;
     for(i = 0; i <= BUFSIZ; i++)
     {
        arg_array[i][0] = '\0';
     }
     return;
}

どんな助けでも大歓迎です

それで、配列にデータを再度追加してから印刷しようとすると、セグメンテーション違反が発生するように見えるので、私はそれを正しく行っていますか?

Empty とは単に空にすることです - どうすればもっと説明できますか? 笑

4

2 に答える 2

1

これを試して:

void make_empty(char **arg_array, int rows, int cols)
    {
     int i,j;
     for(i = 0; i <rows; i++)
     {
       for(j=0; j<cols;j++)
       {
          arg_array[i][j] = '\0';
       }
     }
    return;
    }

行は行数で、列は配列の列数です。

PS この関数は、いつものように配列全体をクリアします。前にコメントしたように、'\0' を文字列の最初の文字として配置しても、行全体がクリアされるわけではなく、printf などの関数の残りの部分が非表示になるだけです。詳細については、このリンクを確認してください: http://cplusplus.com/reference/clibrary/cstdio/printf/

于 2012-04-23T22:51:17.593 に答える
1

空にする必要はありません。malloc多くの場合、C では、呼び出し元が所有していると見なされるメモリのブロックを返すだけのメモリ割り当てが行われます。がcalloc呼び出されると、メモリ ブロックが返されるだけでなく、メモリは 0 に初期化されることが保証されます。これは、すべての意図と目的のために、メモリが既に「空」であることを意味します。

また、コードが意図したとおりに機能するかどうかもよくわかりません。現時点で何をしているのか説明しましょう:

char arg_array = (char**)calloc(strlen(buf), sizeof (char**));

この行は単に間違っています。C では、から返されたポインターをキャストする必要はありません。これは、他のポインター型に暗黙的にキャストされるcalloc型であるためです。void *この場合、char意味のない型に格納しています。これを行う場合:

char ** arg_array = calloc(strlen(buf), sizeof (char**));

次に、長さのポインターの配列を割り当てますstrlen(buf)。の場合buf"hello"、5 つのポインターを格納できる配列を割り当てたことになります。

for(i = 0; i<(strlen(buf)); i++)
{
  arg_array[i] = calloc (strlen(buf), sizeof(char*));
}

繰り返しますが、冗長なキャストを削除しました。これが行うことは、以前に割り当てられた配列にデータを入力することです。配列の各インデックスは、長さのchar文字列を指すようになりました。これはおそらくあなたが望むものではありません。strlen(buf) * sizeof(char *)


あなたの質問は今私にとってより明確です。文字列を入力した後に文字列を削除したいようです。次の 2 つの方法で実行できます。

  • free前に行ったように、各ポインターと後でより多くのスペースを割り当てるかのいずれか
  • または、各文字列の最初の文字をヌル文字に設定します

ポインタを解放するには:

for(i = 0; i<(strlen(buf)); i++)
{
  free(arg_array[i]);
}

各文字列の最初の文字をヌル文字に設定するには:

for(i = 0; i<(strlen(buf)); i++)
{
  arg_array[i][0] = '\0';
}

これは、最初に持っていたものと同じコードであり、問​​題ないはずです。


証拠として、次のコードはエラーなしで実行されます。

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

int main(void)
{
    char *  buf       = "hello";
    char ** arg_array = calloc(strlen(buf), sizeof (char**));
    unsigned int i;


    for(i = 0; i < strlen(buf); i++) {
        arg_array[i] = calloc(strlen(buf),
                sizeof(char *));
    }

    for(i = 0; i < strlen(buf); i++) {
        arg_array[i][0] = '\0';
    }

    for(i = 0; i < strlen(buf); i++) {
        free(arg_array[i]);
    }


    free(arg_array);
    return EXIT_SUCCESS;
}

コードにセグメンテーション違反がある場合、問題は別の場所から発生しています。arg_array変数を上書きしましたか?BUFSIZEは に等しいですかstrlen(buf)?

于 2012-04-23T22:43:08.160 に答える