我的小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值写入内存空间。谢谢你们所有的帮助。 :)
答案 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)之前,你应该比较大小和索引+偏移量。