LinuxC编程中常见的段错误(非法操作内存)情形

char* s="AAA";

printf("%s",s);

s[0]='B';

printf("%s",s);

有什么错?

"AAA"是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。

cosnt char* s="AAA";

然后又因为是常量,所以对是s[0]的赋值操作是不合法的。

#include<stdio.h>

int main(void)

{

    char *ptr = "Linux";

    *ptr = 'T';

    printf("\n [%s] \n", ptr);

    return 0;

}解析:有错误,指针ptr指向常量区空间,内存数据不允许修改*ptr=’T’错误

#include <stdio.h>

void func(char a[10])

{

char c = a[3];

}

int main()

{

char b[10] = "abcdefg";

func(b[10]);

return 0;

}

解析: 这里至少有两上严重错误,

第一,b[10]并不存在,在编译的时候,由于没有去实际地址取值,所以没有出 错。但在运行的时,将计算b[10]的实际地址,并且取值。这时候发生越界错误。

第二,func函数会将传入的char类型的数据当作地址处理,同样会发生错误 。

void test1()

{

char string[10];

char* str1 = "0123456789";

strcpy(string, str1);

}

解答:字符串str1有11个字节(包括末尾的结束符'\0'),而string只有10个字节,故而strcpy会导致数组string越界。

void test2()

{

char string[10], str1[10];

int i;

for(i=0; i<10; i++)

{

    str1[i]= 'a';

}

strcpy(string, str1);

}

解答:因为str1没有结束符'\0',故而strcpy复制的字符数不确定。

char *GetMemory( void )

{

char p[] = "hello world";

return p;

}

void Test( void )

{

char *str = NULL;

str = GetMemory();

printf(str);

}

解答:GetMemory中,p为局部变量,在函数返回后,该局部变量被回收。故而str仍为NULL;

char *memcpy( char *dest, const char *src,int len )

{

char* pDest = (char*)dest;

char* pSrc = (char*)src;

int pos;

for(pos=0;pos<len;pos++)

{

pDest[pos] = pSrc[pos];

}

return (char*)pDest;

}

解析:错误1:未对传入指针进行判断assert(dest !=NULL || src != NULL);

  错误2:返回栈内指针,函数调用后指针空间释放,易造成内存非法访问

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值