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:返回栈内指针,函数调用后指针空间释放,易造成内存非法访问