Сегментация указателей на ошибки - PullRequest
0 голосов
/ 11 марта 2012

Мне нужна помощь, чтобы выяснить, почему я получаю ошибку сегментации здесь.Я прошел через это, и я думаю, что я делаю что-то не так с указателями, но я могу понять, что.

Моя программа:

#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;

};

Ответы [ 3 ]

7 голосов
/ 11 марта 2012

Проблема здесь:

char *a;
*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;
};
1 голос
/ 11 марта 2012

Этот указатель a не получает фактическое место для хранения данных. Вы просто объявляете указатель, но указываете куда? Вы можете назначить память следующим образом:

char *a = malloc(1);

Тогда это не будет сегфолтом. После этого вы должны освободить переменную:

free(a);

Но в этом случае, даже лучше,

char a = 'a';
encript(&a);
1 голос
/ 11 марта 2012
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);
...