의 유형은 test2입니다 char *. 따라서 유형&test2 할 예정입니다 char **매개 변수의 유형과 호환 x의 printchar().
의 유형은 test입니다 char [256]. 그래서, 유형 &test것입니다 수 char (*)[256]있습니다 되지 매개 변수의 유형과 호환 x의 printchar().
test및 주소의 차이점을 보여 드리겠습니다 test2.
#include <stdio.h>
#include <stdlib.h>
static void printchar(char **x)
{
printf("x = %p\n", (void*)x);
printf("*x = %p\n", (void*)(*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';
printf ("test2 : %p\n", (void*)test2);
printf ("&test2 : %p\n", (void*)&test2);
printf ("&test2[0] : %p\n", (void*)&test2[0]);
printchar(&test2); // works
printf ("\n");
printf ("test : %p\n", (void*)test);
printf ("&test : %p\n", (void*)&test);
printf ("&test[0] : %p\n", (void*)&test[0]);
// Commenting below statement
//printchar((char **) &test); // crashes because *x in printchar() has an invalid pointer
free(test2);
return 0;
}
산출:
$ ./a.out
test2 : 0x7fe974c02970
&test2 : 0x7ffee82eb9e8
&test2[0] : 0x7fe974c02970
x = 0x7ffee82eb9e8
*x = 0x7fe974c02970
Test: A
test : 0x7ffee82eba00
&test : 0x7ffee82eba00
&test[0] : 0x7ffee82eba00
여기를 참고하십시오 :
출력 (메모리 어드레스) test2및 &test2[0]인 수치 같은 그들의 타입 인도 동일하다 char *.
그러나 test2및&test2 주소가 다르고 유형도 다릅니다.
의 유형은 test2입니다 char *.
의 유형은 &test2입니다 char **.
x = &test2
*x = test2
(*x)[0] = test2[0]
출력 (메모리 어드레스) test, &test및 &test[0]인 수치 동일 하지만, 그들의 형태는 다르다 .
의 유형은 test입니다 char [256].
의 유형은 &test입니다 char (*) [256].
의 유형은 &test[0]입니다 char *.
출력 도시 된 바와 같이 &test동일하다 &test[0].
x = &test[0]
*x = test[0] //first element of test array which is 'B'
(*x)[0] = ('B')[0] // Not a valid statement
따라서 세그먼테이션 오류가 발생합니다.
char (*)[256]수char**있습니까?