假设这些随机方法
void out_param_test(int *in, int **out)
{
int *temp = calloc(buffer_size, sizeof(int));
for (int i = 0; i < buffer_size; i++)
{
temp[i] = in[i] * 2;
}
*out = temp;
}
主要#1
int main()
{
srand(42);
int *output;
int *one_k_rand_ints = calloc(buffer_size, sizeof(int));
for(int i = 0; i < buffer_size; i++)
{
one_k_rand_ints[i] = rand() % 11;
}
out_param_test(one_k_rand_ints, &output); //works like a charm
}
但是 主要#2
int main()
{
srand(42);
int **output; //Mind the double pointer!
int *one_k_rand_ints = calloc(buffer_size, sizeof(int));
for(int i = 0; i < buffer_size; i++)
{
one_k_rand_ints[i] = rand() % 11;
}
out_param_test(one_k_rand_ints, output); //does not work
}
我不明白,我很沮丧,很累。 我不想理解并关注每一个 C 语言的小怪癖。 每次,我参与一个与 C 相关的项目时,我都需要质疑我所知道的一切并从头开始。也许错误在于说教方法。 我已经编码近十年了。我以前以为我懂C,在软弱的时候我觉得它是故意设计成这样的。不是为了伤害我们,而是出于懒惰。因为对我来说,没有明显的理由说明为什么 main#2 不应该工作。抱歉哭了。
如果有人有好的解释,我将不胜感激。
out
预计是指向要更改的变量的指针。
但是在“main#2”中,您传递了
output
的值,该值是未初始化的。
int *output;
...
out_param_test(one_k_rand_ints, &output); // Modifies `output`.
相当于
int *output;
int **output_ptr = &output;
...
out_param_test(one_k_rand_ints, output_ptr); // Modifies `output`.