指针变量问题

Samuel52 2018-07-07 02:04:27
# include<stdio.h>
int main ()
{
void copy_string (char * from, char * to);
char * a ="I am a teacher.";
char * b = "You are a student.";
char * p=b;
printf ("string a=%s\nstring b=%s\n", a, b);
printf ("\ncopy string a to string b:\n");
copy_string (a, p);
printf ("string a=%s\nstring b=%s\n", a, b);
return 0;
}

void copy_string (char * from, char * to)
{
for (;*from != '\0';from ++, to ++)
{
*to = *from;
}
*to = '\0' ;
}

这代码不知道有什么问题?如果把b换成数组,就没有问题了,这是为什么呢?新手求解,谢谢
...全文
141 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-07-09
  • 打赏
  • 举报
回复
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!
啊大1号 2018-07-08
  • 打赏
  • 举报
回复
印象中这段代码是谭浩强书上的经典错误
zyx6680599 2018-07-07
  • 打赏
  • 举报
回复
引用 1 楼 yangang1899 的回复:
楼主先看下面一段话:
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) : 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域, 程序结束后有系统释放 。
4、文字常量区:常量字符串就是放在这里的, 程序结束后由系统释放 。
5、程序代码区:存放函数体的二进制代码。

好了,你的代码的问题是,你尝试修改文字常量区的内容。为什么换成数组没问题呢,是因为,数组是被放在栈区,是可以访问并修改的。而文字常量区是不可以修改的。

我曾经修改常量地址的地址骗过了编译器的眼睛
RichAndMerry 2018-07-07
  • 打赏
  • 举报
回复
int main()
{
void copy_string(char * from, char * to);
char * a = "I am a teacher.";
char * b = "You are a student.";
//char * p;

printf("string a=%s\nstring b=%s\n", a, b);
printf("\ncopy string a to string b:\n");
b = (char*)malloc(sizeof(char) * strlen(a) + 1); //这里给指针分配了一个内存就可以正常运行了。
copy_string(a, b);
printf("string a=%s\nstring b=%s\n", a, b);

free(b);//释放
system("PAUSE");
return 0;
}

void copy_string(char * from, char * to)
{
for (; *from != '\0'; from++, to++)
{
*to = *from;
}
*to = '\0';
}
yangang1899 2018-07-07
  • 打赏
  • 举报
回复
楼主先看下面一段话:
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) : 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域, 程序结束后有系统释放 。
4、文字常量区:常量字符串就是放在这里的, 程序结束后由系统释放 。
5、程序代码区:存放函数体的二进制代码。

好了,你的代码的问题是,你尝试修改文字常量区的内容。为什么换成数组没问题呢,是因为,数组是被放在栈区,是可以访问并修改的。而文字常量区是不可以修改的。

69,382

社区成员

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

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