我尝试初始化一个指向 char (char**) 的指针:
char arr[8]; char ** arrptr = &arr;
我收到警告: “从不兼容的指针类型初始化”
这有什么问题吗?
&arr
返回一个 char (*)[8]
,一个指向八个 char
数组的指针。
char (*arrptr)[8] = &arr;
&( arr[0] )
返回 char *
,指向字符的指针。
该角色恰好是八个角色中的第一个,但该信息不是通过类型传达的。
char *arrptr = &( arr[0] );
将数组视为指针会导致数组衰减为指向其第一个元素的点。所以这可以简化为
char *arrptr = arr;
A
char**
是指向指针的指针,寻址指针是指向 char
的指针。这可以通过以下方式实现:
char *p1 = arr;
char **p2 = &p1;
不清楚你需要什么,但可能是中间的。
应用地址运算符 (
&
) 时,数组不会衰减为指针。因此,应用于 &
对象的 char[8]
返回指向 char
的 8 元素数组的指针:char(*)[8]
.
要将此对象转换为
char**
,您需要一个可以获取地址的 char*
对象。可以使用辅助变量来实现:
char arr[8];
char *tmp = arr;
char **arrptr = &tmp;
或者使用 C 语言的 C99 修订版中引入的复合文字。
char arr[8];
char **arrptr = &(char*){ arr };
在评论中,您提供
void sbprintf(char **buf, size_t *bufsize, const char * fmt, ...)
getline
是一样的,一个分配内存并通过命令行参数返回指向该内存的指针的函数。
使用方法如下:
char *buf = NULL;
size_t bufsize = 0;
sbprintf( &buf, &bufsize, "...", ... );
free( buf );
如果它像
getline
,它可以接受使用malloc
分配的缓冲区,允许您使用仅在需要时替换的相同缓冲区重复调用它。
char *buf = NULL;
size_t bufsize = 0;
while ( ... ) {
...
sbprintf( &buf, &bufsize, "...", ... );
...
}
free( buf );
不过,我发现它返回
void
很奇怪。它如何发出错误信号???