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

标签 c arrays pointers

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/

相关文章:

arrays - bash 关联数组需要语法错误操作数

c - 简单链表 - 无法访问节点

C 复杂的内存泄漏

c - 在docker容器中获取主机IP

c - 无法使用 mac os 不支持的体系结构编译简单的 c 代码

c - 为什么 *pp[0] 等于 **pp

java - 字符数组,无法获取数组长度

java - 使用通用数组的 ArrayList 转换 ArrayList.toArray()

c++ - 我怎样才能返回数组 C++?

c++ - 将 const 指针 (EVP_MD) 保存到变量,以便在类方法 (HMAC) 中重新使用它