社区
C语言
帖子详情
用strcpy命令,源字符串的值怎么发生变化了呀?
computerclass
2007-08-05 06:22:18
#include<stdio.h>
#include<string.h>
void main()
{
char source[]="We change lives";
char target[]="Test";
strcpy(target,source);
printf("%s",source);
}
...全文
863
26
打赏
收藏
用strcpy命令,源字符串的值怎么发生变化了呀?
#include #include void main() { char source[]="We change lives"; char target[]="Test"; strcpy(target,source); printf("%s",source); }
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
26 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
computerclass
2007-08-06
打赏
举报
回复
不好意思,忘了说了,运行环境是:vc++6.0,
我又看了一下
printf("%x",target);
printf("%x",source);
确实它们之间是相邻的
wh_peng
2007-08-06
打赏
举报
回复
建议用strncpy
lockhall
2007-08-06
打赏
举报
回复
那就是考慮对齐原则吧。
cceczjxy
2007-08-06
打赏
举报
回复
我在linux gcc下,
分配的空间也不相邻,按说应该相邻的呀.
好象是一次是按16个字节为一个单位进行分配的.不明白,请高手解释一下.
lockhall
2007-08-06
打赏
举报
回复
這個應該不好說。
一般好像連續初始化的時候是相鄰的
但也不一定全是。
比如在我的VS2005下就不是相鄰的。
newerC
2007-08-06
打赏
举报
回复
gfxiang(afu)
source和target在栈中是相邻的
-----------------------------------------------------
真的相邻吗? 我看了一下栈中的情况,target的地址比source的地址高,他们不相邻,中间还隔了几个00 byte.(具体是几个不太确定,随target的初始值的变化而变化)
谁帮忙解释一下?
gfxiang
2007-08-06
打赏
举报
回复
to javalei(游客)
这里说的对齐是指字符串数组的4字节对齐,不是指每个char字符占4个字节,比如
char s[11];
char t[3];
一种可能的对齐:
s是从%ebp-12开始向上11个字节
t是从%ebp-16开始向上3个字节
这样s和t之间有一个字节的空隙
其实我们不必太关心这种对齐问题,那是编译器的事
lockhall
2007-08-06
打赏
举报
回复
解釋和實際有時還是不一致的。
expter
2007-08-06
打赏
举报
回复
上面解释很清楚拉...
zhaohan7
2007-08-06
打赏
举报
回复
覆盖了
lockhall
2007-08-06
打赏
举报
回复
額。。。
在我的vs2005上,這種代碼是運行不起來的。
target明顯越界了。
不過還是能看到source并沒有被覆蓋。
sky20010109
2007-08-06
打赏
举报
回复
target 和source所占有的字节不相同,小的把大的给覆盖了,所以越界覆盖了source的头部
zycy
2007-08-06
打赏
举报
回复
strcpy_s也比较保险,会检测数组越界
lockhall
2007-08-06
打赏
举报
回复
嗯,char類型也需要對齊。
javalei
2007-08-06
打赏
举报
回复
to gfxiang(afu)
char类型也需要考虑对齐吗?
gfxiang
2007-08-06
打赏
举报
回复
不相邻的情况那是编译器考虑4字节边界对齐
halve
2007-08-06
打赏
举报
回复
呵呵,似乎是越界
javalei
2007-08-06
打赏
举报
回复
不要使用 strcpy (太危险了) ,建议使用strncpy
我在vc6下测试,二者不是完全相邻的,中间有三个字节的空。
target地址较低(小),source的地址较高(大)
行1 运行strcpy之前的内存分配('\n'用@代替, 三个字节的空隙用#代替),
行2 如 gfxiang(afu) 所说的strcpy的实现方式,运行strcpy之后的内存分配
target source
| |
行1 :Test@###We change lives@
行2 :We change lives@e lives@
所以打印source时(见行2),打印的是 e lives (遇到换行符结束打印)
lovexcj
2007-08-06
打赏
举报
回复
cxvxv
daocaoren0
2007-08-06
打赏
举报
回复
linux下gcc测试
source和target在栈中是相邻的。
#include<stdio.h>
#include<string.h>
void main()
{
char source[]="We change lives";
char target[]="Test";
strcpy(target,source);
printf("%s\n",source);
printf("%s\n",target); //增加一条输出语句
}
输出为:
We change lives
We change lives
why?
加载更多回复(6)
7-21 求特殊方程的正整数解 (15 分)
一、题目要求 本题要求对任意给定的正整数N,求方程X2+Y2=NX^{2} +Y^{2} = NX2+Y2=N的全部正整数解。 输入格式: 输入在一行中给出正整数N(≤10000)。 输出格式: 输出方程X2+Y2=NX^{2} +Y^{2} = NX2+Y2=N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,...
PTA 7-21 求特殊方程的正整数解 (15分)
本题要求对任意给定的正整数N,求方程X 2 +Y 2 =N的全部正整数解。 输入格式: 输入在一行中给出正整数N(≤10000)。 输出格式: 输出方程X 2 +Y 2=N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。 输入样例1: 884 输出样例1: 10 28 20 22 输入样例2: ...
7-21 求特殊方程的正整数解 (15分)
7-21 求特殊方程的正整数解 (15分) 本题要求对任意给定的正整数N,求方程X2 +Y2 =N的全部正整数解。 输入格式: 输入在一行中给出正整数N(≤10000)。 输出格式: 输出方程X2 +Y2 =N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。 输入样例1: 884 输...
7-21 求特殊方程的正整数解 (15 分)
7-21 求特殊方程的正整数解 (15 分) 输入样例1: 884 输出样例1: 10 28 20 22 输入样例2: 11 输出样例2: No Solution AC代码 #include <stdio.h> #include <math.h> int main(){ int X, Y, N; int ret = 0; scanf("%d", &...
求特殊方程的正整数解 c语言,7-21 求特殊方程的正整数解 (15分)
7-21求特殊方程的正整数解(15分)本题要求对任意给定的正整数N,求方程X2+Y2=N的全部正整数解。输入在一行中给出正整数N(≤10000)。输出方程X2+Y2=N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。8841028202211NoSolution作者张彤彧单位浙江大学代码长度限...
C语言
70,040
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章