Linux环境下C语言编程遇到的最多的错误可能非“段错误”莫属了,究其原因就是访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。
下面贴上我遇到的一个段错误的代码片:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *TrimStringInRight(char *str)
{
int n;
if(str!=NULL)//字符串非空
{
for(n=strlen(str);n>0;n--)
{
if(!isblank(str[n-1]))break;
}
str[n]='\0';
}
return str;
}
int main()
{
//char *stra="hello h y ";//这里出错
char stra[]="hello h y ";
printf("%s",TrimStringInRight(stra));
return 0;
}
很简单的一段程序,删除字符串右侧的空格,但是编译运行之后提示段错误。在调试的时候提示是
str[n]='\0';
这句话出现错误。
数组的赋值出现错误,首先想到的就是常量不能赋值。那么结果就很显然了。
对于char stra[]="hello h y ";stra是数组变量,传参至str后,str的内容肯定是能够赋值的。
但是当char *stra="hello h y ";这句话定义的是一个常量。常量是定义在栈里面的,然后将这个栈的地址赋给str,常量是不能修改的,所以就会出现段错误了。