指针到数组指针(char**arrptr = &arr)

7tofc5zh  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(82)

我尝试初始化一个指针,指向一个指向char(char**)的指针:
char arr[8]; char ** arrptr = &arr;
我得到了警告:“从不兼容的指针类型初始化”
这有什么不对?

anauzrmj

anauzrmj1#

&arr返回一个char (*)[8],一个指向八个char的数组的指针。

char (*arrptr)[8] = &arr;

&( arr[0] )返回一个char *,一个字符指针。
这个字符恰好是八个字符中的第一个,但是这个信息不是由类型传达的。

char *arrptr = &( arr[0] );

将数组视为指针会导致数组衰减为指向其第一个元素的指针。所以这可以简化为

char *arrptr = arr;

char**是指向一个指针的指针,被寻址的指针是指向char的指针。这可以如下实现:

char *p1 = arr;
char **p2 = &p1;

不清楚你需要什么,但可能是中间的那个。

nxowjjhe

nxowjjhe2#

当应用address-of运算符(&)时,数组不会衰减为指针。因此,将&应用于char[8]对象将返回指向char的8元素数组的指针:char(*)[8]
要将此对象转换为char**,您需要一个可以获取地址的char*对象。它可以通过一个helper变量来实现:

char arr[8];
char *tmp = arr;
char **arrptr = &tmp;

或者使用C语言的C99修订版中引入的复合文字。

char arr[8];

char **arrptr = &(char*){ arr };
a8jjtwal

a8jjtwal3#

所以你有这个功能:

void sbprintf(char **buf, size_t *bufsize, const char * fmt, ...)

如果没有这个函数的文档,我们无法确定,但是使用char **buf, size_t *bufsize而不是char *buf, size_t bufsize的唯一解释是sbprintf分配缓冲区并通过参数返回它和它的大小(很像GNU的getline)。
下面是它的使用方式:

char *buf = NULL;
size_t bufsize = 0;

sbprintf( &buf, &bufsize, "...", ... );

free( buf );

如果它类似于getline,它可以接受使用malloc分配的缓冲区,如果需要,它可以重新分配。这允许您使用相同的缓冲区重复调用sbprintf

char *buf = NULL;
size_t bufsize = 0;

while ( ... ) {
   ...
   sbprintf( &buf, &bufsize, "...", ... );
   ...
}

free( buf );

相关问题