void check(void* elemAddr){
char* word = *((char**)elemAddr);
printf("word is %s\n",word);
}
int main(){
char array[10] = {'j','o','h','n'};
char * bla = array;
check(&bla);
check(&array);
}
输出:
word is john
RUN FINISHED; Segmentation fault; core dumped;
第一个有效,第二个无效。我不明白为什么会这样。
最佳答案
问题是,当我们做 &array
, 我们得到一个 char (*)[10]
来自 char [10]
, 而不是 char **
.
在我们做实验之前,我要强调的是,当我们将数组作为参数传递给函数时,C 实际上将数组转换为指针。大桶数据没有被复制。
因此,int main(int argc, char **argv)
与 int main(int argc, char *argv[])
相同在 C 中。
这使我们可以使用简单的 printf
打印数组的地址。 .
让我们做个实验:
char array[] = "john";
printf("array: %p\n", array);
printf("&array: %p\n", &array);
// Output:
array: 0x7fff924eaae0
&array: 0x7fff924eaae0
了解这些之后,让我们深入研究您的代码:
char array[10] = "john";
char *bla = array;
check(&bla);
check(&array);
bla
是char *
, 和 &bla
是char **
.
然而,array
是char [10]
, 和 &array
是char (*)[10]
而不是 char **
.
所以当你通过 &array
作为参数,char (*)[10]
就像一个char *
当作为参数传递时,如上所述。
因此**(char **) &bla == 'j'
同时*(char *) &array == 'j'
.做一些简单的实验,你就会证明这一点。
而你正在类型转换 void *elemAddr
到 char **
并尝试尊重它。这仅适用于 &bla
因为它是 char **
. &array
将导致段错误,因为“john”在您执行转换时被解释为地址。
关于c - 对数组的引用与对数组指针的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27755446/