空にする必要はありません。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)
?