gpt4 book ai didi

char ** 然后取消对 char * 的引用

转载 作者:太空宇宙 更新时间:2023-11-04 05:14:15 24 4
gpt4 key购买 nike

为了使用库函数比较字符串,我学会了编写一个比较函数来比较两个字符串,但我不太清楚他们为什么要这样做。

int StrCmp(const void *a, const void *b){
char *s1 = *(char**) a;
char *s2 = *(char**) b;
return strcmp(s1,s2);
}

为什么他们必须先将其转换为 char **?为什么不直接将它们转换为 char * 呢?喜欢

return strcmp((char*)a, (char*)b);

将(一个指针)转换为(一个指向指针的指针)是什么意思如果我有

char *x = "string";

如果我为 x 进行转换

(char**)x; // what is this? Is this character 's'?

我对此很困惑,谢谢你的澄清还有一个问题是关于 const如果它是一个 const,我还能施放它们吗?(虽然我知道我可以)

最佳答案

“为什么他们必须先将它转换为 (char pointer pointer)?为什么不直接将它们转换为(字符指针)呢?”


他们必须将它转换成它本来的样子。假设值指向内存位置 10,000,你有像这样:

  (char **) 

a address a
"points to"
*a **a
mem 1000 mem 10000 mem 20000
to mem 1007 to mem 10007
_____________ _____________ _______________
pointer var --> char pointer -> char
10000 20000 'a'
_____________ _____________ _______________

如果你将它转换为 (char *) 你是在告诉编译器a(在本例中为 10,000)引用的地址是一个字符。这是不正确的。

  (char *)          address a points 
a to
mem 1000 mem 10000 mem 20000
to mem 1007
_____________ ______ ________________
pointer var --> "char" unreachable char
10000 ? 'a'
_____________ ______ ________________

“如果我有,将(一个指针)转换为(一个指向指针的指针)是什么意思

char *x = "字符串";如果我为 x 类型转换

(字符**)x;//这是什么?这个角色是‘s’吗?”


这个例子中存在的是这样的:

x            *x or x[0] x[1]       x[2]      x[3]      x[4]      x[5]      x[6]
mem 15000 mem 30000 mem 30001 mem 30002 mem 30003 mem 30004 mem 30005 mem 30006
to 15007
char * char char char char char char char
_________ _________ _________ _________ _________ _________ _________ _________

30000 --> 's' 't' 'r' 'i' 'n' 'g' '\0'
________ _________ _________ _________ _________ _________ _________ _________

如果你告诉编译器 x 是一个 char** 那么它认为是模式:

x              *x or x[0]         **x
char *
mem 15000 mem 30000 "char"
to 15007 to 30007
__________ _________ _________

30000 --> "string\0?"
converted to
pointer value -> ??
__________ _________ _________

它错误地结束了从 30000 开始的前 8 个字节解析到的任何“地址”并得到一个“字符”。但由于 30000 是一个以 null 结尾的字符数组的开始,充其量它进入内存的某个部分并获得一些随机字节,认为它是一个有效的字符。在最坏的情况下,它会得到一个对该程序无效的地址,从而在它尝试访问它时导致 fatal error 。


我可以这样吗

 return strcmp((char *)a, (char *)b);

不是,因为 a 和 b 不是字符指针。要获取您无法避免的字符指针:

return strcmp( *(char**)a, *(char**)b);

使用 Linden 的示例,您可以这样调用:

#include <stdio.h>
#include <string.h>

int StrCmp(const void *a, const void *b){
char *s1 = *(char**) a;
char *s2 = *(char**) b;
printf("s1:%s\n",s1);
printf("s2:%s\n",s2);
return strcmp(s1,s2);
}

const char* arr_of_ptr[] =
{
"hello",
"world"
};

const char **p_arr_of_ptr = arr_of_ptr;

int main(void)
{
const char *cstring1 = "LaDonna";
const char *cstring2 = "McPherson";
const char **pcstring1 = &cstring1;
const char **pcstring2 = &cstring2;
StrCmp(&arr_of_ptr[0],&arr_of_ptr[1]);
StrCmp(pcstring1,pcstring2);
StrCmp(p_arr_of_ptr,p_arr_of_ptr + 1);
}

关于char ** 然后取消对 char * 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12453930/

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