C语言char数组偏移跳过首字符不生效及递归打印段错误咨询
问题1:跳过字符数组开头N个字符打印的实现
错误原因
你写的*(in_buffer+3);是对地址in_buffer+3的取值操作,属于无副作用的空语句,既没有修改in_buffer本身,也没有修改你传入printf的参数,所以打印仍然从数组起始位置开始。
另外要注意:数组名是常量指针(右值),不能直接做自增/赋值操作,不能写in_buffer +=3这类代码,会直接编译报错。
正确实现
要跳过前N个字符,直接将偏移后的指针传入printf即可:
char in_buffer[8000]={0}; memcpy(in_buffer,REQUEST_1,8000); // 直接传入偏移3个字节的指针,等价于 &in_buffer[3] printf("%s\n", in_buffer + 3);
如果需要用独立指针变量操作,可以这么写:
char *p = in_buffer; p += 3; // 指针偏移3个字符 printf("%s\n", p);
问题2:递归函数段错误原因
你的递归实现存在两个核心问题:
- 内存越界访问:
strncmp(array,"\r\n\r\n",4)要求array指向的地址至少有4个可访问的有效字符,但当指针不断偏移到字符串末尾附近时,剩余字符不足4个,strncmp会访问字符串之外的非法内存,直接触发段错误。 - 递归深度过大导致栈溢出:你的递归逻辑是每偏移1个字符调用一次自身,整个
REQUEST_1字符串长度有数百字节,递归深度等同于字符串长度,会快速耗尽栈空间,最终触发栈溢出段错误。
修正方案
优先用循环实现避免递归栈溢出问题,同时增加剩余长度判断避免越界:
void print(char *array) { int len = strlen(array); for (int i = 0; i <= len -4; i++) { printf("%s\n", array + i); if (strncmp(array + i, "\r\n\r\n", 4) == 0) { break; } } }
如果一定要用递归实现,必须先判断剩余长度:
void print(char *array) { int len = strlen(array); // 剩余长度不足4直接终止,避免越界 if (len <4) return; printf("%s\n",array); if(strncmp(array,"\r\n\r\n",4)!=0) { print(array+1); } }
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

