あなたの特定の問題について:
通常は と同等(*array)[i]
のchar*
を割り当てます。これはエラーが発生しやすくなります。この場合、正しいタイプを見逃さないように使用する必要があります。strlen(fooString)
sizeof(char) * strlen(fooString)
sizeof(*((*array)[i]))
それを解放するには、ループしi = 0
て toi < MAX_ARRAY
を呼び出します。コード内free(array[i])
で何を...
挿入するかは非常に重要です。
一般に、メモリを割り当てるときは、次の一般的な考え方を尊重してください。
- 関数がメモリを割り当てると、後で外部で必要になった場合を除いて、関数自体が解放されます。
- 関数が後で外部で必要なメモリを割り当てる場合、関数はこれを行います。
これにより、コード アーキテクチャが改善され、メモリの解放が容易になります。
例えば:
最初のポイント:
void foo()
{
char *a;
a = malloc(sizeof(*a) * 5);
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
a[3] = 'd';
a[4] = 0; //or '\0' if you prefer
do_something_cool(a);
free(a);
}
この関数foo
は、メモリを割り当て、処理し、解放します。
2 番目のポイント:
char *halfstrdup(char *str)
{
int len;
int i;
char *newstr;
len = strlen(str);
newstr = malloc(sizeof(*newstr) * len / 2)
for (i = 0; i < len; i++)
{
if ((i % 2) == 0)
newstr[i / 2] = str[i];
}
return (newstr);
}
void foo2()
{
char *half;
half = halfstrdup("Hello, world !");
do_something_cooler(half);
free(half);
}
関数halfstrdup
は、必要なメモリを割り当てて設定し、それを返します。関数は、を使用foo2
してメモリを割り当てhalfstrdup
、それを使用して解放します。
ポインターの追跡を失う前に解放することを忘れないでください。たとえば、foo または foo2 から戻った後、割り当てられたメモリを解放することはできません。