gpt4 book ai didi

c - 对数组的引用与对数组指针的引用

转载 作者:太空狗 更新时间:2023-10-29 16:36:13 25 4
gpt4 key购买 nike

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);

blachar * , 和 &blachar ** .

然而,arraychar [10] , 和 &arraychar (*)[10]而不是 char ** .

所以当你通过 &array作为参数,char (*)[10]就像一个char *当作为参数传递时,如上所述。

因此**(char **) &bla == 'j'同时*(char *) &array == 'j' .做一些简单的实验,你就会证明这一点。

而你正在类型转换 void *elemAddrchar **并尝试尊重它。这仅适用于 &bla因为它是 char ** . &array将导致段错误,因为“john”在您执行转换时被解释为地址。

关于c - 对数组的引用与对数组指针的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27755446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com