c语言-C语言指针,字符串复制过程的问题

问题描述

C语言指针,字符串复制过程的问题

下面是字符串复制的代码,str1[]如果限定大小为10,则会溢出,结果是s2正常,s1输出为 u?

请问为什么是这个结果呢?


#include
#include

int main()
{
char *s1;
char *s2;
char str[] = {""How are you?""};
char str1[10]={};
s1 = str;
s2 = str1;
while ((*s2 = *s1) != ''){
s2++;
s1++;
}
s1 = str;
s2 = str1;
printf(""s1: %sns2: %sn"" s1 s2);
return 0;
}

解决方案

首先,要了内存栈地址分布。
在一般操作系统中栈地址从高地址往低地址分布。栈底是高地址,栈顶是低地址。局部变量是按顺序压入栈中。
其次,要了解局部变量的内存分布
程序中有4个局部变量。分别是2个char指针和2个char数组。在32位机上,指针占四个字节,所以s1s2分别占四个字节。str长度是""How are you?""的长度+1(c string末尾有个0)占13个字节,str1初始化10个字节。

由上假设:
str1地址为1000,则str地址1010。根据while循环条件,while循环的赋值执行13次。他会把从1010-1022的内容复制到1000-1012。这时候会覆盖原来1010,1011,1012这三个地址值。这两个值恰好是u,?,。所以这时候打印str的值就是u?.

时间: 2024-11-03 16:28:13

c语言-C语言指针,字符串复制过程的问题的相关文章

c语言 字符串 返回值-C语言 字符串复制 函数返回值问题

问题描述 C语言 字符串复制 函数返回值问题 函数是为了将一个字符串复制一部分到另一个字符串.麻烦看下我函数里边的注释,即我直接用string1做返回值,而不用string.返回的结果不一样.这里有个疑问,string2不是已经被存在string1里面了吗,为什么还要string? 代码如下: #include char *strncpy(char *, char *,int ); int main(void) { char string1[30]="Hello,Jim."; char

c语言-pszBuf为字符串指针,用C语言实现将该字符串中的所有小写字符'a'-'z'转换为大写字符。

问题描述 pszBuf为字符串指针,用C语言实现将该字符串中的所有小写字符'a'-'z'转换为大写字符. 代码中不得调用任何C标准库函数 C语言小白 求解答............................................................................ 解决方案 #include <string.h> void foo(char *pszBuf) { int n = strlen(pszBuf); for (int i = 0; i &l

c语言-C语言用指针给字符串排序,错在哪?

问题描述 C语言用指针给字符串排序,错在哪? #include #include void main() { void max(char *x,char *y,char *z); char a[50],b[50],c[50],d,*p,*q,*m; printf("请输入三个字符串 "); gets(a); gets(b); gets(c); p=a; q=b; m=c; printf("排序如下; "); max(p,q,m); puts(p);puts(q);p

c语言编程-请教c语言指针字符串问题

问题描述 请教c语言指针字符串问题 #include"stdio.h" #include"string.h" int main(void) { char*str[10]; int i; for(i=0;i<10;i++) gets(str[i]); return 0; } 解决方案 C语言字符串的指针C语言中的指针与字符串C语言字符串.指针和内存问题总结 解决方案二: 字符串指针变量(字符串的首地址) 以字符串形式输出以后为什么会和 字符串指针变量的内容是一样

c语言-【C语言】vc6.0运行程序过程中提示***.EXE已停止工作

问题描述 [C语言]vc6.0运行程序过程中提示***.EXE已停止工作 在运行"添加"这一块时,输入完信息之后就提示***.EXE已停止工作,这是什么错? 代码如下 #include #include #include #include #include #define LENTEL sizeof(tel) #define ID struct tel struct tel { char name[15]; char tele[15]; char style[15]; char mai

c语言-C语言中的指针和数组的初始化

问题描述 C语言中的指针和数组的初始化 char a[]=""abcdef"";char *p =""cdefg"";a[1]='A';p[1]='A'; 这段代码有什么问题?#include int main(){ char amessage[]=""now is the time""; char *pmessage = ""now is the time"

c语言字符数组与字符串的使用详解_C 语言

1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理:若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' ). 2.字符数组与字符串在c语言中,将字符串作为字符数组来处理.(c++中不是)在实际应用

Go语言中的指针运算实例分析_Golang

本文实例分析了Go语言中的指针运算方法.分享给大家供大家参考.具体分析如下: Go语言的语法上是不支持指针运算的,所有指针都在可控的一个范围内使用,没有C语言的*void然后随意转换指针类型这样的东西.最近在思考Go如何操作共享内存,共享内存就需要把指针转成不同类型或者对指针进行运算再获取数据. 这里对Go语言内置的unsafe模块做了一个实验,发现通过unsafe模块,Go语言一样可以做指针运算,只是比C的方式繁琐一些,但是理解上是一样的. 下面是实验代码: 复制代码 代码如下: packag

strcpy-C语言结构体之间的复制

问题描述 C语言结构体之间的复制 怎么实现C语言中一维结构体与二维结构之间的复制,比如我现在有两个结构体,都是XML_DATA类型的,其中一个是m_data[10],另外一个是m_sava[10][10],为什么执行strcpy(m_save[k++],m_data);语句不能把m_data中的所有内容复制给m_save了?求大神指点呀,谢谢! 解决方案 最简单的是memcpy函数 解决方案二: C语言中结构体变量复制的例子C语言之结构体c语言中的结构体 解决方案三: strycpy是用来在字符