0

関数で文字列の配列を再割り当てしたいと思います。ここで示すために、非常に単純なプログラムを作成します。文字「b」が出力されることを期待していますが、NULL になります。

void gain_memory(char ***ptr) {
    *ptr = (char **) realloc(*ptr, sizeof(char*) * 2);
    *ptr[1] = "b\0";
}

int main()
{
    char **ptr = malloc(sizeof(char*));
    gain_memory(&ptr);
    printf("%s", ptr[1]); // get NULL instead of "b"
    return 0;
}

どうもありがとうございました!

4

3 に答える 3

3

[] 演算子は * より優先度が高いため、このようにコードを変更すると正しく機能します。

(*ptr)[1] = "b";

PS "\0" は不要です。

于 2012-04-30T09:51:43.157 に答える
0

gain_memory の *ptr を括弧で囲む必要があります。

(*ptr)[1] = "b\0";
于 2012-04-30T09:45:26.023 に答える
-1

文字列の配列内の実際の文字列にメモリを割り当てていないので、次のようなことを行う必要があります。

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

void gain_memory(char ***ptr, int elem) {
    *ptr = (char**)realloc(*ptr, 2*elem*sizeof(char*));
    (*ptr)[1] = "b";
}

int main()
{
    //How many strings in your array?
    //Lets say we want 10 strings
    int elem = 10;
    char **ptr = malloc(sizeof(char*) * elem);
    //Now we allocate memory for each string
    for(int i = 0; i < elem; i++)
        //Lets say we allocate 255 characters for each string
        //plus one for the final '\0'
        ptr[i] = malloc(sizeof(char) * 256);

    //Now we grow the array
    gain_memory(&ptr, elem);
    printf("%s", ptr[1]);
    return 0;
}
于 2012-04-30T09:50:41.613 に答える