2014-04-16 3 views
0

현금화 된 ATM이 없으므로이 코드 스 니펫에서 내가 잘못한 것을 지적하기 위해 paypal을 통해 0.25 달러를 첫 번째 사람에게 제공하고 있습니다 -이 사이트를 위반하지 않았 으면 좋겠습니다. 아무도 모욕하지 않는다.C의 함수에 전달 된 2D 문자 배열 수정

함수에서 다차원 배열을 수정하고 싶습니다. 함수에서 수정되는 동안 범위가 주 함수로 돌아 오면 배열은 변경되지 않습니다.

함수 헤더는 수정할 수 없습니다. 도와 줘서 고마워. 이미 주에 할당하기 때문에

void getAlignment(char*s1, char*s2, char*s3, char*aligned[]) 
{ 
    /*********************** 
    Code here which assigns 
    char**tmp to "different" "words" 
    ***********************/ 

printf("tmp in getAlignment function\n"); 
printf("%s %s\n", tmp[0], tmp[1]); // prints "different words", as expected 
    aligned = tmp; 
} 

int main(void) 
{ 
    // skipped some code 

    char** aligned = (char**)malloc(sizeof(char*)*2); 
    aligned[0] = "should"; 
    aligned[1] = "change"; 

    printf("%s %s\n", aligned[0], aligned[1]); // prints "should change", as expected 
    getAlignment(s1, s2, transcript, aligned); // how do i change aligned during this call? 
    printf("%s %s\n", aligned[0], aligned[1]); // prints "should change" 

    return 0; 
} 
+0

getAlignment() 함수에서 수행하려는 작업은 무엇입니까? 예상되는 결과는 무엇입니까? – user207064

+0

아이디어는'main'에서'aligned'했습니다.'getAlignment' 메소드가 변경된 항목을 가리켜서 getAlignment에서 변경하고 싶습니다. – Rob

답변

1

당신은 내부 getAlignment 쓸 때 : 당신은 몇 가지 새로운 메모리 포인터 GetAlignment::aligned 점하고 있습니다

aligned = (char**) malloc(2*sizeof(char*)); 

. 더 이상 main::aligned이 가리키는 메모리를 가리 키지 않습니다. 이 새 메모리에서 작업 할 때 main::aligned이 가리키고 있던 메모리에는 아무런 영향을 미치지 않습니다.

(참고 - ::은 C 구문이 아니지만 두 가지 변수가 있다는 사실에도 불구하고 두 로컬 변수 모두 aligned이라는 두 변수를 명확히하는 의미입니다.

getAlignment의 코드가 가리키는 메모리를 main::aligned으로 수정한다는 의도 인 경우 위의 행을 제거하면됩니다. 당신의 의도는 getAlignment 새로운 메모리를 할당 할 수 있어야하고, 그 새로운 메모리를 사용하도록 전환 할 main::aligned 것입니다 경우

는, 당신은 (즉 함수 호출의 간접 여분의 수준을 추가) 참조 main::aligned을 통과해야합니다. 그리고 이전에 할당 된 메모리 인 free()을 잊지 마세요.

BTW don't cast malloc.

+0

이것은 올바른 방향으로 나를 가리켰다 (bu dum pshhh). 작은 도움을 원할 경우를 대비하여 페이팔을 알려주십시오. 매우 감사합니다. – Rob

+0

Idon't는 paypal를 사용한다. .. 악이다. 어쨌든 무료로 도와 드리겠습니다. –

0

당신은 기능 getAlignmentaligned = (char**) malloc(2*sizeof(char*)); 다시 2 차원 배열을 할당 할 필요가 없습니다.

당신은 그리고

int alignedStrLen = strlen(s3); 
aligned[0] = malloc((alignedStrLen+1)*sizeof(char)); 
aligned[0][alignedStrLen] = '\0'; 
aligned[1] = malloc((alignedStrLen+1)*sizeof(char)); 
aligned[1][alignedStrLen] = '\0'; 

같은 배열의 각 요소를 할당이 필요하고 당신은 malloc에 의해 할당 된 메모리를 해제해야한다.

+0

'main'에서 방금'char ** aligned'을 선언하고 그것을 초기화한다고 선언했습니다. 생각은 내가'alignment'가 가리키는 것과 관계없이'getAlignment' 함수가'aligned'을 수정하기를 원합니다. – Rob