2017-12-20 8 views
2

C void 함수 및 문자열을 실험하고 있습니다. 그것은 나를 위해 처음 a A � 다음 세그먼트 오류를 ​​인쇄C 동일한 배열을 인쇄하면 두 가지 방법으로 다른 결과가 나타납니다.

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

void print(char** test); 
int main(){ 
    char* test = "abcdef"; 
    print(&test); 
    return 0; 
} 
void print(char** test){ 
    for(int i=0;i<strlen(*test);i++) 
     printf("%c\n",*test[i]); 
} 

:이 프로그램을 시도했습니다. 하지만 *test[i]*(*test+i)으로 변경 한 후 예상했던대로 거의 동일하게 작동합니다.

*test[i]*(*test+i)이 아닌 경우 두 번째 예에서 코드가 작동하는 이유는 무엇입니까?

+8

이것은 [* 연산자 우선 순위 *] (http://en.cppreference.com/w/c/language/operator_precedence) 문제입니다. 배열 인덱스 연산자'[]'는 역 참조 연산자'*'보다 우선 순위가 높습니다. 뭔가 [좋은 초보자 책] (http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)이 당신에게 (IMO) 말 했어야합니다. –

+4

또한 "거의 똑같은"것은 * "* 정확히 * 같은 것"이 아닙니다. 사실, 당신이 생각하는 두 가지 표현은 "거의 똑같은 것"입니다 * 아닙니다 *. (이유에 대한 나의 이전 코멘트를보십시오). –

+2

그래서이 문제를 해결하려면'(* test) [i]'를 할 수 있습니까? –

답변

4

testchar**입니다. 으로 주석 일부 프로그래머 친구[]은 그래서 당신의 루프는 다음과 같이 실행되는 *보다 우선합니다 :

  1. *test[0] == *(test[0]) == 'a'
  2. *test[1] ==를 *(test[1]) == * (에 저장되어 다른 주소 메모리 후 &test) => UB

어느 프로그램 전체에 하나의 간접를 사용 (예 : *하지 ** 및) 또는 사용 (*test)[i]