0

快速 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

看起来我对通过函数时指针会发生什么有一些误解。有什么想法吗?

4

2 回答 2

3
*char_data = commandArray;

您将堆栈(自动)数组的地址放在外部内存位置。这是灾难的秘诀(未定义的行为),因为commandArray的生命周期一data_generator返回就结束了。的元素也是如此commandArray,它们本身就是指向堆栈数组元素的指针。

于 2010-10-01T04:30:37.377 回答
0

改变:

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

到:

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

这会将 command1[] 和 command2[] 保留在保留的内存中。

那,或者 malloc() 它们,正如另一张海报所建议的那样,尽管正确使用 malloc'c 内存需要的考虑比我在这里讨论的要多。

于 2010-10-01T07:36:43.243 回答