2017-02-07 2 views
-1

그래서 x [2]에서 값을 0에서 8로 변경하려고합니다.이 방법을 사용하면 작동하지 않습니다. 어떻게해야합니까? 나는 주변을 검색해 보았으나 아무 소용이 없었다.이 값을 변경하지 않는 이유는 무엇입니까?

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

void changevar(int* x){ 
    int* y; 
    y = &x[2]; 
    y = 8; 
} 
int main(int argc, char** argv){ 
    int* c; 
    c = (int*) malloc(sizeof(int)); 
    printf("here %d\n", c[2]); 
    changevar(&c); 
    printf("here %d\n", c[2]); 
    free(c); 
} 

편집 : 나는 포인터

+2

당신은 하나의 정수를위한 공간을 할당하지만, "버퍼"에 세 번째에 액세스 할 수 있습니다. 코드의 동작은 정의되지 않았으므로 "수정"할 필요가 없습니다. – StoryTeller

+2

1)'c [2]'는 정의되지 않은 행동입니다. 2)'changevar (& c)'는 제약 조건 위반 (즉, 컴파일 불가능)입니다. 'changevar'는'int *'인수를 기대합니다. 당신은'int **'인자를 전달하고 있습니다. 3)'y = 8 '은 제약 위반 (즉, 비 - 편집 가능)이다. 임의의 정수를 포인터에 할당 할 수 없습니다. – AnT

+0

@AnT 그 점을 지적 해 주셔서 감사합니다! 원래 매개 변수에 changevar (int ** x)가 있습니다. 내가 x를 어떻게 바꿀 수 있는지 아십니까? – reVolutionary

답변

1

에 새로 온 당신 충분한 공간을 할당 할 첫 번째 필요 :

c = malloc(3 * sizeof(int)); 

공지 사항 I didn't cast the return value 것을.

값은 이 아니며은 0으로 초기화됩니다. 그것들은 무엇이든 될 수 있습니다 ("undefined").

memset(c, 0, 3 * sizeof(int)); 

다음, 당신은 당신의 기능에이기 때문에이 값 을 통과해야합니다 : 당신은 그것을 지울 수 있습니다. (그것은 결국, 이미 포인터입니다.) 함수 내에서

changevar(c); 

, 당신은 그것을 액세스 할 주소를 역 참조해야합니다 :

*y = 8; 

사람들은 내가 보는 오류가 있습니다.

0

그래서 두 가지 문제점이 있습니다.

  1. 는 당신은 당신 malloc 호출 한 int에 대한 메모리를 할당하지만 3 ints에 대한 최소한의 공간을 할당 제안 메모리에 액세스하려는.
  2. 함수의 매개 변수는 int*으로되어 있지만, changevar(&c)으로 지정하면 포인터 주소를 부여하기 때문에 int**으로 전달됩니다.

변경이 수행 될 필요성이 단지 두 해결보기

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

void changevar(int* x){ 
    x[2] = 8; // <-- can be simplified to this one line 
} 

int main(int argc, char** argv){ 
    int* c; 
    int amt = 3; // <-- number of ints you want to be able to have space for 
    c = malloc(sizeof(int) * amt); // <-- multiply the size and the amount you want 
    printf("here %d\n", c[2]); 
    changevar(c); // <-- remove the '&' from the argument to just pass the pointer 'c' 
    printf("here %d\n", c[2]); 
    free(c); 
} 

출력이된다 : 배열 c 크기이므로

here 0 
here 8 
0

쓰레기 값이 출력되고 1.

c = (int*) malloc(sizeof(int)); 

rray c 크기 1

c[2]은 가비지 값입니다. 대부분의 시스템에서는 가비지 번호 대신 0이 인쇄됩니다.

&c[2]y은 같은 주소를 참조하지 않습니다.

은 무엇 당신이 원하는 것은 아마 이것이다 :

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

void changevar(int** x){ 
    *(*x+2)=8; 
} 
int main(int argc, char** argv){ 
    int* c; 
    c = (int*) malloc(3*sizeof(int)); 
    for(int i=0;i<3;i++){ 
     c[i]=0; 
    } 
    printf("here %d\n", c[2]); 
    changevar(&c); 
    printf("\nhere %d\n", c[2]); 
    free(c); 
} 

인쇄 :

here 0 
here 8 
관련 문제