将char写入char *地址时出现分段错误

时间:2010-06-15 10:42:32

标签: c++ c pointers segmentation-fault

我的小C程序有问题。也许你可以帮助我。

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”的帮助下,将一些char值写入内存空间。谢谢你们所有的帮助。 :)

4 个答案:

答案 0 :(得分:2)

你是否有机会调用这样的代码:

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

如果是这样,您的代码会尝试写入字符文字,这在C中是非法的。您应该这样做:

char buf[] = "foobar";
shiftujVzorku( buf, "xx", 0 );

答案 1 :(得分:0)

因为pom + size + index指向的地址不是允许程序写入的内存位置。

要检查的事项:'text'是某种合法的缓冲区吗?它只是传入,所以在代码来自它的代码中没有任何线索。你有没有动摇它?它在某个堆栈上吗?此外,它实际上是NUL在它进入时终止了吗?

答案 2 :(得分:0)

我认为程序正在做什么,或者至少是函数采用的参数。现在,看起来问题是你循环index直到pom + index指向字符串的结尾,但是你试图访问pom + index + offset,这是在offset结束之后串。或者{{1}}可能是否定的?

答案 3 :(得分:0)

多么糟糕!

无论如何,问题来自于我认为的偏移。你甚至不检查*(pom + index + offset)是你可以使用的内存位置。也许是在你文本的'\ 0'之后。

在尝试使用*(pom + index + offset)之前,你应该比较大小和索引+偏移量。