请看下面的代码。它尝试将数组作为a char**
传递给函数:
#include <stdio.h>
#include <stdlib.h>
static void printchar(char **x)
{
printf("Test: %c\n", (*x)[0]);
}
int main(int argc, char *argv[])
{
char test[256];
char *test2 = malloc(256);
test[0] = 'B';
test2[0] = 'A';
printchar(&test2); // works
printchar((char **) &test); // crashes because *x in printchar() has an invalid pointer
free(test2);
return 0;
}
我只能通过显式强制转换&test2
为char**
已经编译的事实来暗示此代码是错误的。
不过,我想知道这到底有什么问题。我可以将指针传递给动态分配的数组的指针,但不能将指针传递给堆栈上的数组的指针。当然,我可以通过首先将数组分配给一个临时变量来轻松解决该问题,如下所示:
char test[256];
char *tmp = test;
test[0] = 'B';
printchar(&tmp);
仍然,有人可以向我解释为什么直接强制char[256]
转换不起作用char**
吗?
因为test
不是指针。
&test
获取指向类型char (*)[256]
不兼容char**
的数组的指针(因为数组不是指针)。这导致未定义的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句