C - Двойной указатель теряется при вызове функции - PullRequest
0 голосов
/ 01 октября 2010

Quick C вопрос здесь.Недавно мы играли с двойными, тройными и даже четверными указателями.Хотя мы и разбирались в вещах, пока не столкнулись с этой проблемой ...

char ***data;
data_generator(&data);
char **temp = data[0];          
printf("printing temp[%d]: %s\n",0, temp[0]);
printf("printing temp[%d]: %s\n",1, temp[1]);
dosomething(temp);

int dosomething(char **array) { 

    printf("printing array[%d]: %s\n",0, array[0]);
    printf("printing array[%d]: %s\n",1, array[1]);
    ......
}

int data_generator(char ****char_data) {
    char *command1[2];
    char *command2[2];

    command1[0] = "right";
    command1[1] = "left";

    command2[0] = "up";
    command2[1] = "down";

    char **commandArray[2];

    commandArray[0] = command1;
    commandArray[1] = command2;

    number_of_commands = 2;

    if(number_of_commands > 1){
    *char_data = commandArray;
    }

    return number_of_commands - 1;
}

И это распечатывает ...

printing temp[0]: right
printing temp[1]: left
Segmentation fault

Похоже, у меня есть некоторые неправильные представления о том, чтопроисходит с указателем при передаче через функцию.Есть мысли?

Ответы [ 2 ]

3 голосов
/ 01 октября 2010
*char_data = commandArray;

Вы помещаете адрес стекового (автоматического) массива во внешнюю область памяти. Это рецепт для катастрофы (неопределенное поведение), поскольку время жизни commandArray заканчивается, как только возвращается data_generator. То же самое верно для элементов commandArray, которые сами являются указателями на элементы массива.

0 голосов
/ 01 октября 2010

Изменение:

char *command1[2];
char *command2[2];

до:

static char *command1[2];
static char *command2[2];

Это сохранит command1 [] и command2 [] в сохраненной памяти.

Это или malloc (), как рекомендует другой автор, хотя для правильного использования памяти malloc требуется больше соображений, чем я буду обсуждать здесь.

...