2012-03-11 4 views
0

여기 왜 세분화 오류가 발생하는지 파악하는 데 도움이 필요합니다. 나는 그것을 끝내었고 나는 포인터에 뭔가 잘못하고 있다고 생각하지만, 나는 무엇을 알아낼 수있다.C segmentation fault-char 포인터

내 프로그램 :

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

void encrypt(char* c); 

//characters are shifted by 175 

int main(){ 

char* a; 
*a = 'a'; 
/*SEGMENTATION FAULT HERE!*/ 

encrypt(a); 
printf("test:%c/n",*a); 

return 0; 

}; 
void encrypt(char* c){ 
    char* result; 
    int i=(int)(*c); 
    i+=175; 
    if(i>255) 
    { 
      i-=256; 
    } 
    *c=(char)i; 

}; 

답변

7

문제는 여기에 있습니다 :

char *a; 
*a = 'a' 

변수 "는"초기화되지 않기 때문에, * A = 'A'임의의 메모리 위치에 할당된다.

당신은 이런 식으로 뭔가를 할 수 :

char a[1]; 
a[0] = 'a'; 
encrypt(&a[0]); 

심지어 당신의 경우 하나의 문자 사용

int main(){ 
    char a = 'a'; 

    encrypt(&a); 
    printf("test:%c/n",a); 

    return 0; 
}; 
+0

하는 일 즉,이 경우에, 더 나은,

free(a); 

을하지만 : 당신은 나중에 변수를 해제해야합니다! 감사! – spatara

1
char* a; 
*a = 'a'; 
/*SEGMENTATION FAULT HERE!*/ 

어떤 "가"거기되지 않습니다. a을 신고했으며 초기화되지 않은 상태로 두었습니다. 그런 다음 주소로 사용하려고했습니다. a을 가리 키도록해야합니다.

한 예 :

char buffer[512]; 
char *a = buffer; 

(buffer가 최대 크기를 가지고 있으며이 범위를 벗어날 때 당신이 그것에 어떤 포인터를 참조 할 수 없습니다.)

또는 동적 메모리 :

char *a = malloc(/* Some size... */); 

if (!a) { /* TODO: handle memory allocation failure */ } 

// todo - do something with a. 

free(a); 
1

해당 포인터 a은 데이터를 저장할 실제 공간을 확보하지 못합니다. 방금 포인터를 선언했지만 어디를 가리키고 있습니까? 다음과 같이 메모리를 할당 할 수 있습니다.

char *a = malloc(1); 

그런 다음 오류가 발생하지 않습니다.

char a = 'a'; 
encript(&a); 
+0

'malloc (1)'은이 특별한 예제를 다루는 무거운 가중치처럼 보입니다. –

+0

네, 맞습니다. 동적 메모리를 할당하기위한 몇 가지 패턴을 보여 주기만하면됩니다. –

+0

감사합니다. 이것은 또한 좋은 해결책입니다 :) – spatara