2013-10-22 2 views
0
#include <iostream> 

int main() { 
    char* chars = new char[4]; 
    for(int i = 0; i < 4; ++i) 
    { 
     chars[i] = 'a'; 
    } 
    std::cout << chars; 
    return 0; 
} 

코드 덩어리가 올바르게 작동합니다. 표준 출력은 표준 에러에 아무것도 빈배열 할당이 포인터 구문과 작동하지 않습니다.

chars[i] = 'a'; 

*(chars++) = 'a'; 

*chars++ = 'a'; 

또는

메이크업의 표준 출력을 변경하지만

aaaa 

말했다. 무슨 일이야? 나는 []가 * 포인터에 대한 구문 론적 설탕이라고 생각했습니다.

+1

'(* chars) ++'이어야합니다. – 0x499602D2

+1

'* (chars + i)'와 가장 비슷하지만, 코드는 정의되지 않은 행동을합니다. – chris

+0

(* chars) ++로 변경하면 "왼쪽 피연산자로 필요합니다."라는 오류가 발생합니다. –

답변

4

chars을 반복하여 *chars++ = 'a'을 사용하면 포인터를 수정할 수 있습니다. 마침내 문자열을 출력 할 때 문자열 끝에 도달 한 문자를 가리키고 있습니다.

은 아마 당신은 이런 일을하려고했다 :

for(char *p = chars, *end = chars + 4; p != end;) 
{ 
    *p++ = 'a'; 
} 

을하지만이 못생긴입니다. 첫 번째 방법 (chars[i])이 더 좋습니다. 두 경우 모두 Null 종료자를 필요로하므로 배열의 크기가 4 자 문자열을 포함 할만큼 크지 않습니다.

char *chars = new char[5]; 
char *p = chars; 
for(int i = 0; i < 4; i++) *p++ = 'a'; 
*p = '\0';         // null-terminate the string 
cout << chars; 
delete [] chars; 

동적 할당에는 별다른 영향을주지 않습니다. 왜 스택에 문자를 선언하지 않는가? 또한 모두 0으로 초기화하는 것은 나쁜 습관이 아닙니다.

char chars[5] = {0}; 
+1

"모두 0으로 초기화하는 것은 좋지 않습니다." +1. –

+0

이제 나머지는 읽었지만 +2는 할 수 없습니다. :( –

관련 문제