2013-07-03 4 views
0

정수 포인터 배열을 설정하려고합니다. 프로그램은 인덱스 i의 포인터를 값 2 * i의 정수를 가리 키도록 설정합니다. 그런 다음 프로그램은 0, 4, 6, 8이어야하는 처음 5 개의 포인터 요소의 pointee를 인쇄해야합니다.정수 포인터 배열 설정

어떤 이유로 세그먼트 화 오류가 발생합니다. 아무도 왜 이것이 일어나고 내가 그것을 고칠 수 있는지 말해 줄 수 있습니까?

마지막 줄을 "arr [index] = & i;"로 바꾸려고했는데 세그먼트 화 오류가 아니지만 여전히 잘못된 결과를 제공합니다.

도움이 될만한 점은 포인터 배열을 시작하는 것입니다.

#include <stdio.h> 

void setArr (int); 

int * arr[10]; // array of 10 int pointers 

int main(int argc, char *argv[]) 
{ 
    int i; 

     setArr(0); 
     setArr(1); 
     setArr(2); 
     setArr(3); 
     setArr(4); 


     for(i=0; i<5;i++) 
      printf("arr [%d] = %d\n", i, *arr[i]); /* should be 0, 2, 4, 6, 8 */ 

    return 0; 
} 

/* set arr[index], which is a pointer, to point to an integer of value 2*index */ 
void setArr (int index){ 
    int i = 2 * index; 
    * arr[index] = i; 
} 
+1

'int * arr [10]'은 단지 10 개의 포인터이며 유효한 메모리를 가리 키지 않습니다. 'int arr [10]'과'arr [index] = i;' – VoidPointer

+1

을 할당하거나 사용하고 전역 변수 plox를 사용하지 마십시오! –

답변

2

문제는 배열의 각 항목이 가리키는 메모리를 할당하지 않는다는 것입니다. 라인

*arr[index] = i; 

i의 값 (arr[index]에 원래이었다 무엇이든) 어떤 임의의 메모리 주소를 설정합니다.

은 당신이해야 할 것은 :

void setArr(int index) 
{ 
    int *i = malloc(sizeof(int)); // allocate memory for the value 
    *i = 2 * index; // set the value 
    arr[index] = i; // make the array slot point at the value 
} 

하지만 당신은 free()에 메모리 이상을 확인해야합니다.

for (i = 0; i < 5; i++) 
    free(arr[i]); 
+0

array [index] = & i; 작업? – Sophie

+1

@Sophie'i'의 타입은'int *'이지만'& i'의 타입은'int **'입니다; 이것은 int에 대한 포인터 인 _to_ 포인터입니다. 배열의 값은 간단히 정수 값을 가리 킵니다 (그래서 '& i'대신'i'를 사용합니다). – feralin

+0

감사합니다. 훨씬 명확합니다. – Sophie

0

배열 내부에 포인터를 배치하려면 malloc 공간이 필요합니다.

+1

"... 그렇지 않으면 할당 ..." –

+0

뭐야? 나는 대답을 쓰지 않았다 ... –

0

이 Yashavant P. Kanetkar의 하자 우리 "C"의 9 장에서 가져온 것입니다 당신이 무슨 짓을 이전하지 않은 이유 명확히해야한다 : 예를 들어, main() 함수에서 return 0; 문 앞에 넣어 작업.

우리가 2 차원 문자 배열을 사용할 때 우리는 배열을 선언 할 문자열을 초기화하거나 scanf() 함수를 사용하여 문자열을받을 수 있습니다. 그러나 문자열에 대한 포인터 배열을 사용하면 배열을 선언하는 위치에서 문자열을 초기화 할 수 있지만 scanf()를 사용하여 키보드에서 문자열을받을 수 없습니다. 따라서, 다음 프로그램은 결코 작동하지 않을 것입니다.

main() 
{ 
char *names[6] ; 
int i ; 
for (i = 0 ; i <= 5 ; i++) 
{ 
printf ("\nEnter name ") ; 
scanf ("%s", names[i]) ; 
} 
} 

프로그램이 작동하지 않습니다. 우리가 배열을 선언 할 때 그것은 쓰레기 값을 포함하고있다. 그리고 키보드에서받은 문자열을 유지해야하는 주소로 scanf()에 이러한 가비지 값을 보내는 것은 잘못된 것입니다. Solution scanf()를 사용하여 키보드에서 문자열을받은 다음 문자열을 가리키는 포인터 배열에 주소를 저장하는 경우 구부러지면 아래와 같이 약간 둥근 방식으로 주소를 지정할 수 있습니다.

#include "alloc.h" 
main() 
352 Let Us C 
{ 
char *names[6] ; 
char n[50] ; 
int len, i ; 
char *p ; 
for (i = 0 ; i <= 5 ; i++) 
{ 
printf ("\nEnter name ") ; 
scanf ("%s", n) ; 
len = strlen (n) ; 
p = malloc (len + 1) ; 
strcpy (p, n) ; 
names[i] = p ; 
} 
for (i = 0 ; i <= 5 ; i++) 
printf ("\n%s", names[i]) ; 
} 

여기서 우리는 문자열 n []에서 scanf()를 사용하여 이름을 처음 수신했습니다. 그런 다음이 이름의 복사본을 만들기 위해 strlen()과 할당 된 공간을 사용하여 길이를 알아 냈습니다. 이 메모리 할당은 malloc()이라는 표준 라이브러리 함수를 사용하여 수행되었습니다. 이 함수는 할당 할 바이트 수를 요구하고 할당 할 메모리 청크의 기본 주소를 반환합니다. 이 함수가 반환하는 주소는 항상 void * 형식입니다. 따라서 typecasting이라는 기능을 사용하여 char *로 변환되었습니다. 형변환은 15 장에서 자세히 논의된다.이 함수의 프로토 타입은 'alloc.h'파일에서 선언되었습니다. 따라서 우리는이 파일을 #include했다. 그러나 왜 우리는 메모리를 할당하기 위해 배열을 사용하지 않았습니까? 이는 배열을 사용할 때 프로그램을 작성할 때 배열의 크기를 커밋해야하기 때문입니다. 또한, 프로그램을 실행하는 동안 배열 크기를 늘리거나 줄일 수있는 방법이 없습니다. 즉, 배열을 사용할 때 정적 메모리 할당이 발생합니다. 9 장 : 문자열에서의 인형 3535 malloc()을 사용하여 실행하는 동안 메모리를 동적으로 할당 할 수 있습니다. 우리가 malloc()에 넘기는 인수는 실행 중에 값이 변경 될 수있는 변수가 될 수 있습니다. malloc()을 사용하여 메모리를 할당하면 키보드를 통해받은 이름을이 할당 된 공간에 복사 한 다음 문자열의 포인터 배열 인 names []의 해당 요소에 할당 된 청크의 주소를 저장합니다. 메모리를 할당 한 다음 복사해야하기 때문에이 솔루션은 성능이 떨어집니다.