C - 双指针因函数调用而丢失

时间:2010-10-01 04:22:45

标签: c pointers multidimensional-array cstring

快速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 个答案:

答案 0 :(得分:3)

*char_data = commandArray;

您将堆栈(自动)阵列的地址放在外部存储器位置。这是一个灾难的处方(未定义的行为),因为commandArray的生命周期在data_generator返回后立即结束。 commandArray的元素也是如此,它们本身就是堆栈数组元素的指针。

答案 1 :(得分:0)

变化:

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

为:

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

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

那个,或者malloc(),正如另一张海报所推荐的那样,尽管正确使用malloc'c内存需要更多的考虑,而不是我在这里讨论。