2011-09-23 6 views
1

메모리를 할당하고 포인터로 채우고 싶습니다. 함수 매개 변수 중 하나이지만, 중요한 것은 없으므로 제발 도와주세요. 나는 모든 것이 잘 작동 할 경우로컬 함수에서 포인터 할당 및 초기화

그래서 :

void alloc(char **p, int n) 
{ 
*p = new char[n]; 
} 

int main() { 
char * ptr = NULL; 
int n = 10; 
alloc(&ptr, n); 
for(int i = 0; i<(n - 1); i++) 
    ptr[i] = '1'; 
ptr[n - 1] = '\0'; 

printf("%s", ptr); 
return 0; 
} 

는 지금은 기능

void alloc(char **p, int n) 
{ 
*p = new char[n]; 
for(int i = 0; i<(n - 1); i++) 
    *p[i] = '1'; 
*p[n - 1] = '\0'; 
} 

int main() { 
char * ptr = NULL; 
int n = 10; 
alloc(&ptr, n); 
printf("%s", ptr); 
return 0; 
} 

프로그램 충돌로도 할당 된 메모리를 초기화합니다. 나는 이유를 모르겠다. 제발, 누군가 설명 할 수 있니?

+1

'*'vs'[]'의 우선 순위에 대해 잘 모르겠습니다. 아마도'char *'라고 선언 할까? – Seb

+0

과도한 기억, 모든 사람 아래에 올바른 조언을 해줍니다. – Alecs

답변

4

대신 (*p)[i](*p)[n - 1]을 시도하십시오. 우선 순위 규칙에 따라 *p[i]*(p[i])으로 평가됩니다.

+0

작동합니다. 감사합니다! 그리고 메모리를 할당하는이 방법은 정확합니까? 포인터가 아무 것도 가리 키지 않기 때문에 잘못된 것이라고 들었습니다. – Alecs

+0

@Alecs : 맞습니다. 'ptr'은 실제로 아무 것도 가리 키지 않지만,'alloc'에 전달하는 것은'ptr'에 대한 포인터입니다. 따라서'* p'는'ptr'가 가리키는 것이 아니라'ptr' 자체를 가리 킵니다. 그리고'* p = new char [n];'은'ptr'가 무언가를 가리키게하므로'* p'와'ptr'를 배열로 사용하는 것이 안전합니다. –

3

이 시도 :

((*p)[i]) = '1'; 

당신이 운영자의 평가 순서에 문제가 있습니다.

+0

작동합니다. 감사합니다! 그리고 메모리를 할당하는이 방법은 정확합니까?나는 포인터가 아무 것도 가리 키지 않기 때문에 그것이 틀렸다는 말을 들었다. – Alecs

2

아마이 때문에 : 당신이 쓴 것처럼

*p[i] 

는 해석이 :

*(p[i]) 

당신은 아마 당신은 무엇을 의미 인이, 쓴없는 것처럼 :

(*p)[i] 
+0

작동합니다. 감사합니다! 그리고 메모리를 할당하는이 방법은 정확합니까? 나는 포인터가 아무 것도 가리 키지 않기 때문에 그것이 틀렸다는 말을 들었다. – Alecs

1

시도해보십시오.

#include <stdio.h> // for NULL 

void alloc(char **p, int n) 
{ 
    *p = new char[n]; 
    for(int i = 0; i<(n - 1); i++) 
     *((*p) + i) = '1'; 
    *((*p) + n - 1) = '\0'; 
} 

int main() { 
    char * ptr = NULL; 
    int n = 10; 
    alloc(&ptr, n); 
    printf("%s", ptr); 

    // never forget delete pointers 
    delete [] ptr; 
    return 0; 

} 
+0

작동합니다. 감사합니다! 그리고 메모리를 할당하는이 방법은 정확합니까? 나는 포인터가 아무 것도 가리 키지 않기 때문에 그것이 틀렸다는 말을 들었다. – Alecs

1

운영자에게 우선 순위가 있습니다. 당신의 ALLOC 기능이 시도 :이 트릭을 할해야

for(int i = 0; i<(n - 1); i++) 
    (*p)[i] = '1'; 
(*p)[n - 1] = '\0'; 
+0

작동합니다. 감사합니다! 그리고 메모리를 할당하는이 방법은 정확합니까? 나는 포인터가 아무 것도 가리 키지 않기 때문에 그것이 틀렸다는 말을 들었다. – Alecs

+0

@Alecs : 예 할당이 맞습니다. – sashang

2

,

당신은 인자로 포인터를 사용하여 주장하는 경우
void 
alloc(char*& p, int n) 
{ 
    p = new char[n]; 
    std::fill_n(p, n - 1, '1'); 
    p[n - 1] = '\0'; 
} 

(*p)에 함수에서 p모든 변경 (그리고 null 포인터 을 확인하는 것을 잊지 말고 합당한 일을하십시오.

모든 것이 고려됩니다. 당신은 std::stringstd::string(n, '1') 쓸 수있는이 기능을 사용하지 않는 것이 더 좋을 꺼야.

+0

예, C보다 C++를 더 좋아하지만 지금은 C와 작동해야합니다. – Alecs

+0

@Alecs :'new'는 C++입니다. –

+0

아, 예, 알 수 있습니다.이 간단한 예제에서는 할당하는 방법에 문제가 없습니다. 문제는 다른 것입니다. 제가 썼을 때 자동으로 새로운 것으로 써야합니다 :-) – Alecs