char *p、char p[]、字符串的几个题目
总结一下遇到的关于char *p、char p[]和字符串的题目:
例一:(指针的指针)
- 1 void getmemory(char **p)
- 2 {
- 3 p = (char *)malloc(100); //p应该是*p,因为这里是对传入的二重指针所指向的内容分配空间,而不是二重指针的地址,
- 4 //所以应该为 *p = (char*)malloc(100);
- 5 }
- 6
- 7 int main()
- 8 {
- 9 char *str = NULL;
- 10 getmemory(str); //这里应该传入&str,所以应该为 getmemory(&str);
- 11 strcpy(str, "hello world!");
- 12 printf("%s\n", str);
- 13 free(str);
- 14 while (1);
- 15 return 0;
- 16 }
例二:(局部指针传到外面)
- 1 char *getstring()
- 2 {
- 3 char p[] = "hello world";
- 4 return p;
- 5 }
- 6
- 7 int main()
- 8 {
- 9 char *str = NULL;
- 10 str = getstring(); //用str接收getstring()函数返回的局部变量,
- 11 printf("%s\n", str); //但是在getstring()函数执行完时,p的内存空间就被系统回收了,也就是str所指向的空间被回收了,所以这里无法打印出hello world
- 12
- 13 while (1);
- 14 return 0;
- 15 }
例三:
- 1 int main()
- 2 {
- 3 char a[4];
- 4 //char a;
- 5 char *str = &a; //这里指针级别不同,但是仍然能输出"hello",最好改为*str = a;
- 6 strcpy(str, "hello");
- 7 printf("%s\n", str);
- 8
- 9 while (1);
- 10 return 0;
- 11 }
说明:除了改变第9行的&a为a之外,按照代码中第8行和第9行的写法也可以正确输出"hello";这里a不会出现越界的问题。
不妨修改一下main():
- 1 int main()
- 2 {
- 3 char a[4];
- 4 strcpy(a, "hello");
- 5 printf("%s\n", a);
- 6
- 7 while (1);
- 8 return 0;
- 9 }
说明:这里a也不会出现越界的问题,最后可以输出"hello";但是如果我们把char a[4]换成char *a; 来看看会发生什么:
- 1 int main()
- 2 {
- 3 char *a;
- 4 strcpy(a, "hello");
- 5 printf("%s\n", a);
- 6
- 7 while (1);
- 8 return 0;
- 9 }
输出error:main.c(4): error C4700: 使用了未初始化的局部变量“a”;
说明:char *a;是在声明一个变量,是没有分配内存的,所以这里不能strcpy的;
strcpy需要复制到一个有效的,能存储字符串的空间,而a只是一个地址,能存的也是一个地址。
例四:
- 1 int main()
- 2 {
- 3 char *src = "123456789";
- 4 int len = strlen(src);
- 5
- 6 char *dest = (char*)malloc(len);
- 7 char *d = dest;
- 8 char *s = src[len];
- 9
- 10 while (len--)
- 11 {
- 12 d++ = s--;
- 13
- 14 }
- 15 printf("%s\n", dest);
- 16
- 17 while (1);
- 18 return 0;
- 19 }
上面代码一堆错误,太坑了。自己不妨先看看如何改正。
错误的地方:
第8行:char *s = &src[len-1];
第12行:这里=左边的d“左操作数必须为左值”;改为d = s--; 对应15行dest改为d。
修改后源码:
- 1 int main()
- 2 {
- 3 char *src = "123456789";
- 4 int len = strlen(src);
- 5
- 6 char *dest = (char*)malloc(len);
- 7 char *d = dest;
- 8 char *s = &src[len-1];
- 9
- 10 while (len--)
- 11 {
- 12 d = s--;
- 13 }
- 14 printf("%s\n", d);
- 15
- 16 while (1);
- 17 return 0;
- 18 }
例五:
- 1 int main()
- 2 {
- 3 char *s = "12345";
- 4 strcpy(s, "67890");
- 5 return 0;
- 6 }
说明:第3行相当于 const char *s = "12345"; 所以在第4行对s进行修改时,程序会中断。第3行改为char s[] = "12345";即可。
再看一个类似的例子:
- 1 int main()
- 2 {
- 3 char s[] = "12345";
- 4 char *s2 = "12345";
- 5 const char *s3 = "12345";
- 6
- 7 strcpy(s, "67890");
- 8
- 9 printf("%s\n", s);
- 10
- 11 while (1);
- 12 return 0;
- 13 }
变量地址:
图中可以看出来:s2和s3的地址都是0x007c56e8,为常量存储区;s一个临时变量,属于栈区,所以s指向的内容可以修改,而s2,s3指向的内容则不能修改。
例六:
- 1 int main()
- 2 {
- 3 char *p = "linux";
- 4 *p = 'L';
- 5 printf("\n [%s] \n", p);
- 6
- 7 while (1);
- 8 return 0;
- 9 }
这个和上面的是相同的问题。第3行改为char p[] = "linux";即可。
个人总结不一定全对,欢迎指正~
char *p、char p[]、字符串的几个题目的更多相关文章
- 字符串复制char *strcpy(char* dest, const char *src);
⒈strcpy的实现代码 char * strcpy(char * strDest,const char * strSrc) { if ((NULL==strDest) || (NULL==strSr ...
- C 和 OC 字符串转换 NSString 和 char * 转换 const char* 与 char *
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { char *s = "He ...
- 用c++语言编写函数 int index(char *s,char * t),返回字符串t在字符串s中出现的最左边的位置,如果s中没有与t匹配的子串,则返回-1。类似于索引的功能。
首先,分析一下程序的思路: 1:从s的第i个元素开始,与t中的第1个元素匹配,如果相等,则将s的第i+1元素与t中的第2个元素匹配,以此类推,如果t所有元素都匹配,则返回位置i;否则,执行2; 2: ...
- char型指针和字符串字面量和字符数组
1.当一个char型指针指向一个字符串字面量(也就是常量字符串)时,该指针必须由const修饰,否则,系统会给出deprecated(不赞成)的警告.原因是:字符串字面量不可改变,当它被一个非cons ...
- 两个字符串 char* a, char* b,输出b在a中的位置次序。
/** 题目: 两个字符串 char* a, char* b,输出b在a中的位置次序. void output_postion(const char* a, const char* b); 如:a = ...
- 给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg, 字符串内的其他字符不改变,给定函数,编写函数 void Stringchang(const char*input,char*output)其中input是输入字符串,output是输出字符串
import java.util.Scanner; /*** * 1. 给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg, 字符串内的其他字 ...
- C++ 字符串、string、char *、char[]、const char*的转换和区别
1.字符串 字符串本质就是一串字符,在C++中大家想到字符串往往第一反应是std::string(后面简称string) 字符串得从C语言说起,string其实是个类,C语言是没有class的,所以C ...
- char* 和char[]的区别
以下内容均来自互联网,系笔者汇总并总结. 1. 问题介绍 问题引入:在实习过程中发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="ab ...
- char*和char []
1.char *s1 = "ssss"; 2.char s2[] = "bbbb"; 对于第一种,我是无法理解,无法想象字符串赋值给一个char类型的指针,查了 ...
随机推荐
- 占位符,SQL注入?
这两天在上课时被同学拿了一段代码问我,这段代码有什么问题,我看了一会说:Connection和PreparedStatement都没关.他说不止这方面的问题,还有sql注入的问题,我就坚决的说使用了占 ...
- 【二食堂】Alpha- 发布声明
MarkTexting Alpha版本发布声明 今日我们的MarkTexting正式上线了! 功能介绍 我们实现了一个简单的文本标注生成知识图谱的网站,在Alpha阶段,我们实现的功能有: 登陆注册 ...
- BUAA_2020_软件工程_结对项目作业
项目 内容 这个作业属于哪个课程 班级博客 这个作业的要求在哪里 作业要求 我在这个课程的目标是 掌握软件工程的思路方法 这个作业在哪个具体方面帮助我实现目标 学习结对编程 教学班级 006 项目地址 ...
- OO第四单元及学期总结
OO第四单元及学期总结 第四单元两次作业的架构设计 第一次作业 类图: 树形结构:使用Operation类管理UMLOperation以及parent为该UMLOperation的参数(UMLpara ...
- Linux线程互斥学习笔记--详细分析
一.互斥锁 为啥要有互斥? 多个进程/线程执行的先后顺序不确定,何时切出CPU也不确定. 多个进程/线程访问变量的动作往往不是原子的. 1. 操作步骤 (1)创建锁 // 创建互斥锁mutex pth ...
- [CSP-S2021] 回文
链接: P7915 题意: 给出一个长度为 \(2n\) 的序列 \(a\),其中 \(1\sim n\) 每个数出现了 2 次.有 L,R 两种操作分别是将 \(a\) 的开头或末尾元素加入到初始为 ...
- A*,IDA*—高档次的暴搜
A*通过评价函数来判断当前状态是否可以到达最终状态(即可行性剪枝),来减少不必要的搜索. 例题--P2324 [SCOI2005]骑士精神 我们通过当前不在指定位置上的棋子个数为评价函数,\(used ...
- 源码解析-Abp vNext丨分布式事件总线DistributedEventBus
前言 上一节咱们讲了LocalEventBus,本节来讲本地事件总线(DistributedEventBus),采用的RabbitMQ进行实现. Volo.Abp.EventBus.RabbitMQ模 ...
- jquery正则表达式验证【是否带有小数、是否中文名称组成、是否全由8位数字组成、电话码格式、邮件地址】
1 <form name="myform" action="" onsubmit="return fun1()"> 2 < ...
- Python NameError:name ‘xrange’ is not defined
在python3 中会出这个问题,而xrange( )函数时在python 2.x中的一个函数,在Python 3中,range()的实现方式与xrange()函数相同,所以就不存在专用的xrange ...