Ошибка сегментации при записи char в адрес char * - PullRequest
1 голос
/ 15 июня 2010

У меня проблема с моей маленькой программой на Си.Может быть, вы могли бы помочь мне.

char* shiftujVzorku(char* text, char* pattern, int offset){
    char* pom = text;
    int size = 0;
    int index = 0;
    while(*(text + size) != '\0'){
        size++;
    }
    while(*(pom + index) != '\0'){
        if(overVzorku(pom + index, pattern)){
            while(*pattern != '\0'){
                //vyment *pom s *pom + offset
                if(pom + index + offset < text + size){
                    char x = *(pom + index + offset);
                    char y = *(pom + index);
                    int adresa = *(pom + index + offset);
                    *(pom + index + offset) = y;   // SEGMENTATION FAULT
                    *(pom + index) = x;   
                    //*pom  = *pom - *(pom + offset);
                    //*(pom + offset) = *(pom + offset) + *pom;
                    //*pom = *(pom + offset) - *pom;
                }
                else{
                    *pom  = *pom - *(pom + offset - size);
                    *(pom + offset - size) = *(pom + offset - size) + *pom;
                    *pom = *(pom + offset - size) - *pom;
                }
                pattern++;
            }
            break;
        }
        index++;
    }
    return text;
}

Не важно, что делает программа.Может быть, есть много ошибок.Но почему я получаю SEGMENTATION FAULT (пункт назначения см. В коде) в этой строке?Я пытаюсь записать некоторое значение символа в пространство памяти с помощью адреса «pom + offset + index».Спасибо за все полезное.:)

Ответы [ 4 ]

2 голосов
/ 15 июня 2010

Вы случайно вызываете код следующим образом:

shiftujVzorku( "foobar", "xx", 0 );

Если это так, ваш код пытается записать символьный литерал, что недопустимо в C. Вы должны сделать:

char buf[] = "foobar";
shiftujVzorku( buf, "xx", 0 );
0 голосов
/ 15 июня 2010

Какой беспорядок!

Во всяком случае, проблема приходит со смещения, я думаю.Вы даже не проверяете, что * (pom + index + offset) - это область памяти, которую вы можете использовать.Возможно, это после '\ 0' вашего текста.

Вы должны сравнить размер и индекс + смещение, прежде чем пытаться использовать * (pom + index + offset).

0 голосов
/ 15 июня 2010

Я думаю, что Неважно, что делает программа или, по крайней мере, какие параметры принимает функция. Прямо сейчас, похоже, проблема в том, что вы зацикливаете index до тех пор, пока pom + index не указывает на конец строки, но затем вы пытаетесь получить доступ к pom + index + offset, который находится после конца строки. Или, может быть, offset отрицательно?

0 голосов
/ 15 июня 2010

Поскольку адрес, на который указывает pom + size + index, не является областью памяти, в которую вашей программе разрешено записывать.

Что нужно проверить: текстовый ли это законный буфер? Он только что передан, так что в коде, приведенном там, откуда он появился, нет никакой подсказки. Ты это неправильно? Это где-то в стеке? Кроме того, это действительно NUL прекращается, когда он входит?

...