快速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
看起来我对通过函数传递指针时会发生什么有一些误解。有什么想法吗?
答案 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内存需要更多的考虑,而不是我在这里讨论。