指针晕乎吖

拿云️ 2019-04-15 03:43:31
各位前辈能不能看看这里指针用的为什么不对吖,谢谢啦 #include <stdio.h>
void strcat( char *p1,char *p2);
int main()
{
char *p1="people`s republic ";
char *p2="of China";
strcat(p1,p2);
printf("%s",p1);
}

void strcat( char *p1,char *p2)
{
while(*p1!='\0')
p1++;
while(*p2!='\0')
{
*p1=*p2;
p2++;
p1++;
}
*p1='\0';

}
...全文
821 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
小薛引路 2019-04-20
  • 打赏
  • 举报
回复
p1是指向常量区的指针,一经分配内存,不可更改;你的函数是在操作无效内存,所以出错
小薛引路 2019-04-20
  • 打赏
  • 举报
回复
p1是指向常量区的指针,一经分配内存,不可更改;你的函数是在操作无效内存,所以出错
小薛引路 2019-04-20
  • 打赏
  • 举报
回复
p1是指向常量区的指针,一经分配内存,不可更改;你的函数是在操作无效内存,所以出错
花火66666 2019-04-19
  • 打赏
  • 举报
回复
你这么用指针是不对的,你第一个指针已经分配好了固定的字符串长度的地址,你再把第二个字符串的数组追加到第一个上,是相当于溢出的。
luj_1768 2019-04-18
  • 打赏
  • 举报
回复
strcat 函数实现有误。请重写代码。
dahjgcqvwvr 2019-04-17
  • 打赏
  • 举报
回复
常量字符串不能被修改
qq_36838959 2019-04-17
  • 打赏
  • 举报
回复
指针是可以用的,应该是你的字符常量有问题
拿云️ 2019-04-16
  • 打赏
  • 举报
回复
引用 17 楼 拥抱Linux的回复:
[quote=引用 12 楼 涤 的回复:]
[quote=引用 11 楼 拥抱Linux的回复:]1楼说的对!你的代码的问题,不是指针用得不对,而是没有区分清楚字符串常量和字符(串)变量。

开头的两句定义语句:

char *p1="people`s republic ";
char *p2="of China";

右边的两个字符串是作为常量储存或者放在内存中的常量区的,是不允许被代码修改的,否则会出现内存访问错误:segmentation fault (core dumped)。

简单地说,就是下面这样的赋值语句是错误的:

"people`s republic " = "people`s republic of China";
// 也就是,
常量 = (右值);

因为,常量是不能被赋值的,是不允许的。也就是内存中的常量区是不允许这样修改的 。这样说,应该可以明白吧?

那p1="mat"是可以的吧,这是改变p1的指向还是"mat"
代替了原来的字符串?为什么那两个字符串作为常量储存呢,作为常量储存是什么意思吖[/quote]

p1 = "mat"; 可以,因为 p1 是字符(串)指针变量,这条语句的意思是「把字符串"mat"的首地址赋予字符指针变量p1」,所以是可以的。
改变的是指针p1的指向,肯定不会改变"mat"呀!
也不会代替原来的字符串"people`s republic ",因为现在等于是有了两个字符串:"mat"和"people`s republic ",只不过现在p1指向了字符串"mat"而不再指向字符串"people`s republic "了。
常量,顾名思义就是恒常的量,就是在程序执行过程中,其值不发生改变的量;而与之相对,其值可变的量就称为变量。常量,包括常见的数值、字符串等,比如int型数值 1 就是int型常量,字符串"good" 就是字符串常量,它们被存放在内存中的常量存储区。
而何谓常量存储区或者常量区呢?这就涉及到内存中的分区问题,包括代码区、常量区、静态区(全局区)、堆区、栈区等,这方面的内容三言两语就不容易说清楚了,建议你根据这些关键词查找相关的资料了解学习一下吧。[/quote] 好的,我知道了,谢谢你的帮助吖
我是瓶起子 2019-04-16
  • 打赏
  • 举报
回复
引用 12 楼 涤 的回复:
[quote=引用 11 楼 拥抱Linux的回复:]1楼说的对!你的代码的问题,不是指针用得不对,而是没有区分清楚字符串常量和字符(串)变量。

开头的两句定义语句:

char *p1="people`s republic ";
char *p2="of China";

右边的两个字符串是作为常量储存或者放在内存中的常量区的,是不允许被代码修改的,否则会出现内存访问错误:segmentation fault (core dumped)。

简单地说,就是下面这样的赋值语句是错误的:

"people`s republic " = "people`s republic of China";
// 也就是,
常量 = (右值);

因为,常量是不能被赋值的,是不允许的。也就是内存中的常量区是不允许这样修改的 。这样说,应该可以明白吧?

那p1="mat"是可以的吧,这是改变p1的指向还是"mat"
代替了原来的字符串?为什么那两个字符串作为常量储存呢,作为常量储存是什么意思吖[/quote]
char *p1 = (char[]){"people`s republic "};
Cry . 2019-04-16
  • 打赏
  • 举报
回复
引用 20 楼 lin5161678的回复:
[quote=引用 19 楼 Cherry Cry 的回复:] 因为你对p1 p2 是const的 看你的赋值就知道 ,放在数组中或者放在容器中就可以
错的 p1 p2都不是const的 p1 p2完全可以写在赋值符号左边[/quote] 不好意思,应该是常量指针 而不是指针常量 应该所指对象是不能修改的
拥抱Linux 2019-04-16
  • 打赏
  • 举报
回复
引用 12 楼 涤 的回复:
[quote=引用 11 楼 拥抱Linux的回复:]1楼说的对!你的代码的问题,不是指针用得不对,而是没有区分清楚字符串常量和字符(串)变量。

开头的两句定义语句:

char *p1="people`s republic ";
char *p2="of China";

右边的两个字符串是作为常量储存或者放在内存中的常量区的,是不允许被代码修改的,否则会出现内存访问错误:segmentation fault (core dumped)。

简单地说,就是下面这样的赋值语句是错误的:

"people`s republic " = "people`s republic of China";
// 也就是,
常量 = (右值);

因为,常量是不能被赋值的,是不允许的。也就是内存中的常量区是不允许这样修改的 。这样说,应该可以明白吧?

那p1="mat"是可以的吧,这是改变p1的指向还是"mat"
代替了原来的字符串?为什么那两个字符串作为常量储存呢,作为常量储存是什么意思吖[/quote]

p1 = "mat"; 可以,因为 p1 是字符(串)指针变量,这条语句的意思是「把字符串"mat"的首地址赋予字符指针变量p1」,所以是可以的。
改变的是指针p1的指向,肯定不会改变"mat"呀!
也不会代替原来的字符串"people`s republic ",因为现在等于是有了两个字符串:"mat"和"people`s republic ",只不过现在p1指向了字符串"mat"而不再指向字符串"people`s republic "了。
常量,顾名思义就是恒常的量,就是在程序执行过程中,其值不发生改变的量;而与之相对,其值可变的量就称为变量。常量,包括常见的数值、字符串等,比如int型数值 1 就是int型常量,字符串"good" 就是字符串常量,它们被存放在内存中的常量存储区。
而何谓常量存储区或者常量区呢?这就涉及到内存中的分区问题,包括代码区、常量区、静态区(全局区)、堆区、栈区等,这方面的内容三言两语就不容易说清楚了,建议你根据这些关键词查找相关的资料了解学习一下吧。
sichuanwww 2019-04-16
  • 打赏
  • 举报
回复
用这个string类不是很好吗?非要用char *吗?
拥抱Linux 2019-04-16
  • 打赏
  • 举报
回复
引用 13 楼 lin5161678 的回复:
[quote=引用 11 楼 拥抱Linux 的回复:]
1楼说的对!你的代码的问题,不是指针用得不对,而是没有区分清楚字符串常量和字符(串)变量。

开头的两句定义语句:

char *p1="people`s republic ";
char *p2="of China";

右边的两个字符串是作为常量储存或者放在内存中的常量区的,是不允许被代码修改的,否则会出现内存访问错误:segmentation fault (core dumped)。

简单地说,就是下面这样的赋值语句是错误的:

"people`s republic " = "people`s republic of China";
// 也就是,
常量 = (右值);

因为,常量是不能被赋值的,是不允许的。也就是内存中的常量区是不允许这样修改的 。这样说,应该可以明白吧?
例子错了

"people`s republic " = "people`s republic of China";

和你前面说的 和 楼主的错误 都没什么关系
这个是数组不能做左值
[/quote]

嗯,也可以这么说吧。俺当时举这个例子是基于两方面的原因,(1)字符串常量,是常量,不能作为左值,(2)具体这个字符串常量,是提问的代码里面的那个字符串常量,这样看比较直观,举别的例子,或者拿字符数组的数组名来举例的话,担心提问者不理解。

另外,俺之前看的资料是把数组名和具体字符串常量不能作为左值分开来讲的,所以俺也是一直把这两种情况分开来归类的,尽管这两种情况的编译器报错信息写的都是数组类型不能被赋值。
也多谢赐教!
lin5161678 2019-04-16
  • 打赏
  • 举报
回复
引用 19 楼 Cherry Cry 的回复:
因为你对p1 p2 是const的 看你的赋值就知道 ,放在数组中或者放在容器中就可以
错的 p1 p2都不是const的 p1 p2完全可以写在赋值符号左边
Cry . 2019-04-16
  • 打赏
  • 举报
回复
因为你对p1 p2 是const的 看你的赋值就知道 ,放在数组中或者放在容器中就可以
lin5161678 2019-04-16
  • 打赏
  • 举报
回复
引用 14 楼 我是瓶起子 的回复:
[quote=引用 12 楼 涤 的回复:]
[quote=引用 11 楼 拥抱Linux的回复:]1楼说的对!你的代码的问题,不是指针用得不对,而是没有区分清楚字符串常量和字符(串)变量。

开头的两句定义语句:

char *p1="people`s republic ";
char *p2="of China";

右边的两个字符串是作为常量储存或者放在内存中的常量区的,是不允许被代码修改的,否则会出现内存访问错误:segmentation fault (core dumped)。

简单地说,就是下面这样的赋值语句是错误的:

"people`s republic " = "people`s republic of China";
// 也就是,
常量 = (右值);

因为,常量是不能被赋值的,是不允许的。也就是内存中的常量区是不允许这样修改的 。这样说,应该可以明白吧?

那p1="mat"是可以的吧,这是改变p1的指向还是"mat"
代替了原来的字符串?为什么那两个字符串作为常量储存呢,作为常量储存是什么意思吖[/quote]
char *p1 = (char[]){"people`s republic "};[/quote]现在的确是可以修改了
但是越界
lin5161678 2019-04-15
  • 打赏
  • 举报
回复
引用 11 楼 拥抱Linux 的回复:
1楼说的对!你的代码的问题,不是指针用得不对,而是没有区分清楚字符串常量和字符(串)变量。

开头的两句定义语句:

char *p1="people`s republic ";
char *p2="of China";

右边的两个字符串是作为常量储存或者放在内存中的常量区的,是不允许被代码修改的,否则会出现内存访问错误:segmentation fault (core dumped)。

简单地说,就是下面这样的赋值语句是错误的:

"people`s republic " = "people`s republic of China";
// 也就是,
常量 = (右值);

因为,常量是不能被赋值的,是不允许的。也就是内存中的常量区是不允许这样修改的 。这样说,应该可以明白吧?
例子错了

"people`s republic " = "people`s republic of China";

和你前面说的 和 楼主的错误 都没什么关系
这个是数组不能做左值
拿云️ 2019-04-15
  • 打赏
  • 举报
回复
引用 11 楼 拥抱Linux的回复:
1楼说的对!你的代码的问题,不是指针用得不对,而是没有区分清楚字符串常量和字符(串)变量。

开头的两句定义语句:

char *p1="people`s republic ";
char *p2="of China";

右边的两个字符串是作为常量储存或者放在内存中的常量区的,是不允许被代码修改的,否则会出现内存访问错误:segmentation fault (core dumped)。

简单地说,就是下面这样的赋值语句是错误的:

"people`s republic " = "people`s republic of China";
// 也就是,
常量 = (右值);

因为,常量是不能被赋值的,是不允许的。也就是内存中的常量区是不允许这样修改的 。这样说,应该可以明白吧?
那p1="mat"是可以的吧,这是改变p1的指向还是"mat" 代替了原来的字符串?为什么那两个字符串作为常量储存呢,作为常量储存是什么意思吖
拥抱Linux 2019-04-15
  • 打赏
  • 举报
回复
1楼说的对!你的代码的问题,不是指针用得不对,而是没有区分清楚字符串常量和字符(串)变量。

开头的两句定义语句:

char *p1="people`s republic ";
char *p2="of China";

右边的两个字符串是作为常量储存或者放在内存中的常量区的,是不允许被代码修改的,否则会出现内存访问错误:segmentation fault (core dumped)。

简单地说,就是下面这样的赋值语句是错误的:

"people`s republic " = "people`s republic of China";
// 也就是,
常量 = (右值);

因为,常量是不能被赋值的,是不允许的。也就是内存中的常量区是不允许这样修改的 。这样说,应该可以明白吧?
qybao 2019-04-15
  • 打赏
  • 举报
回复
也不是非要用数组,只是"people`s republic ";被编译为常量了,所以你可以*p1申请内存,然后拷贝"people`s republic ";
当然最方便还是用数组
加载更多回复(9)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧