怎么把指针的字符串给数组

怎么把指针的字符串给数组,第1张

1 如何把一个字符指针指向的字符串复制给字符数组
假如有char p且p已指向一含有10个元素的字符数组,现有目标数组char b[10],则可以有三种函数可以实现字符串复制。

1、strcpy

语法格式: strcpy(目标地址,源地址)

此例语法:strcpy(b,p);
将源地址后的字符逐一复制到目标地址中,直到遇到结束符,如果源串中不含结束符就会造成目标数组越界。

2、strncpy

语法格式:strncpy(目标地址,源地址,字符长度)

此例语法:strncpy(b,p,10);

将源地址开始前n个(指定字符长度)字符逐一复制到目标地址中,不检测结束符也不检测边界,当指定长度大于目标数组长度则会越界。

3、memcpy

语法格式:memcpy(目标地址,源地址,字节长度)

此例语法:memcpy(b,p,sizeof(char)10);

内存数据块复制,执行效率最高的一个。将源地址开始前n个(指定字符长度字符的数据宽度)字节的内容复逐一复制到目标地址中,无视数组元素类型,只按字节复制,不检测数组边界,当指定长度大于目标数组长度则会越界。这里需要注意的是数组长度必须通过给定的元素类型获得数据宽度(sizeof(char))然后计算出实际的内存大小。
2 怎么将指针指向的字符串赋值给数组
#include<stdioh>

#include<stringh>

char copystr(const chars1,char p1[100])

{

int i=0;

while(s1[i]!='\0')

{

p1[i]=s1[i];

i++;

}

p1[i]='\0';

return p1;

}

int main()

{

const char s="hello! what are you doing";

char p[100];

char q;

q=(char)s;这句话直接把s的地址赋值给q

copystr(s,p);这个是函数一个一个赋值

puts(p);

puts(q);

return 0;

}
3 如何把一个字符指针指向的字符串复制给字符数组
假如有char p且p已指向一含有10个元素的字符数组,现有目标数组char b[10],则可以有三种函数可e799bee5baa6e58685e5aeb931333339666639以实现字符串复制。

1、strcpy语法格式: strcpy(目标地址,源地址)此例语法:strcpy(b,p);将源地址后的字符逐一复制到目标地址中,直到遇到结束符,如果源串中不含结束符就会造成目标数组越界。2、strncpy语法格式:strncpy(目标地址,源地址,字符长度)此例语法:strncpy(b,p,10);将源地址开始前n个(指定字符长度)字符逐一复制到目标地址中,不检测结束符也不检测边界,当指定长度大于目标数组长度则会越界。

3、memcpy语法格式:memcpy(目标地址,源地址,字节长度)此例语法:memcpy(b,p,sizeof(char)10);内存数据块复制,执行效率最高的一个。将源地址开始前n个(指定字符长度字符的数据宽度)字节的内容复逐一复制到目标地址中,无视数组元素类型,只按字节复制,不检测数组边界,当指定长度大于目标数组长度则会越界。

这里需要注意的是数组长度必须通过给定的元素类型获得数据宽度(sizeof(char))然后计算出实际的内存大小。
4 C语言中如果将一个指针所指向的字符串赋给数组
数组声明的时候就要指定大小的

可以用memcpy,对于字符串,也可以用strcpy或strncpy(需要包含stringh)

比如:

char p="abc";

char a[10];

memcpy(a,p,sizeof(a));

或者

strcpy(a,p);

或者

strncpy(a,p,sizeof(a));/ 比上面的strcpy安全 /

PS:关于sizeof,取数组的时候是数组的大小,指针的话,32位机器,会是4,所以字符串指针不用sizeof取长度,用strlen();
5 怎么将指针得到的数据传递给数组
主要是指针数组与数组指针的区别 定义 int (p)[n];这个是数组指针 ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。

也就是说执行p+1时,p要跨过n个整型数据的长度 定义 int p[n];这个是指针数组 []优先级高,先与p结合成为一个数组,再由int说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]。

p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 p=a; 这里p表示指针数组第一个元素的值,a的首地址的值。

内存溢出(out of memory)
是指程序在申请内存时,没有足够的内存空间供其使用。
内存泄漏(memory leak)
是指程序在申请内存后,无法释放已申请的内存空间,占用有用内存。
注:内存泄漏最终会导致内存溢出
简单理解,内存溢出就是要求分配的内存超出了系统所给的。内存泄漏是指向系统申请分配内存进行使用(new),但是用完后不归还(delete),导致占用有效内存。
内存泄漏可分为4类:
1常发性内存泄漏
引起内存泄漏的代码会被很多次执行,每次执行的时候都会导致内存泄漏
2偶发性内存泄漏
在某些特定的环境下执行引起内存泄漏的代码,才会引起内存泄漏
从以上两种内存泄漏的方式来看,测试环境和测试方法在程序生命周期的重要性是不可或缺的。
3一次性内存泄漏
代码只会执行一次,但总有一块内存发生泄漏,多见于构造类的时候,析构函数没有释放内存。
4隐式泄漏
程序运行过程中不断的分配内存,直到结束时才释放内存,但一般服务器程序会运行较长的时间,不及时释放也会导致内存耗尽以至于内存泄漏。
综上所述,一次性内存泄漏对用户的程序维护是没有什么实质性的伤害,但在实际生活中,我们还是尽可能要避免此类的事件发生。
内存越界
是指向系统申请一块内存后,使用时却超出申请范围。比如一些 *** 作内存的函数:sprintf、strcpy、strcat、vsprintf、memcpy、memset、memmove。当造成内存泄漏的代码运行时,所带来的错误是无法避免的,通常会造成
1破坏了堆中内存内存分配信息数据
2破坏了程序其他对象的内存空间
3破坏了空闲内存块
附:如果在之前你的程序运行一切正常,但因为你新增了几个类的成员变量或者修改了一部分代码(前提是保证你的这些修改是完全正确的)而导致程序发生错误,则因考虑是否是内存被破坏的原因了,重点排查内存是否越界。
缓冲区溢出(栈溢出)
程序为了临时存取数据的需要,一般会分配一些内存空间称为缓冲区。如果向缓冲区中写入缓冲区无法容纳的数据,机会造成缓冲区以外的存储单元被改写,称为缓冲区溢出。而栈溢出是缓冲区溢出的一种,原理也是相同的。分为上溢出和下溢出。其中,上溢出是指栈满而又向其增加新的数据,导致数据溢出;下溢出是指空栈而又进行删除 *** 作等,导致空间溢出。

memcpy不管你传入的指针, 只是固定的赋值
作为一个函数, 它没办法做到传入的指针的原始属性
而你在调用的时候, 又做了强制转换, 于是调用时的编译器判断也被你绕过去了
从而导致一切正常
更重要的是, new出来的空间,本身就是可以赋值的, 并没有const属性, 这个属性是你强加的, 又强行去掉, 自然就一切正常了
如果你改成
const char str ="1234567890";
这个是系统赋予的const属性, 强制memcpy也可以通过编译, 但运行就会挂掉了
PS:你目前的代码是存在越界的
const char str = new char(20);
char ch = new char(10);
小括号应该是中括号 即
const char str = new char[20];
char ch = new char[10];
目前的代码 只是分配了一个字符空间, 初始化为括号里面的值

Linux c/c++上常用内存泄露检测工具有valgrind, Rational purify。Valgrind免费。Valgrind可以在 32位或64位 PowerPC/Linux内核上工作。
Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif。下面分别介绍个工具的作用:
Memcheck 工具主要检查下面的程序错误:
• 使用未初始化的内存 (Use of uninitialised memory)
• 使用已经释放了的内存 (Reading/writing memory after it has been free’d)
• 使用超过 malloc分配的内存空间(Reading/writing off the end of malloc’d blocks)
• 对堆栈的非法访问 (Reading/writing inappropriate areas on the stack)
• 申请的空间是否有释放 (Memory leaks – where pointers to malloc’d blocks are lost forever)
• malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])
• src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions)
Valgrind不检查静态分配数组的使用情况。
Valgrind占用了更多的内存--可达两倍于你程序的正常使用量。如果你用Valgrind来检测使用大量内存的程序就会遇到问题,它可能会用很长的时间来运行测试
21 下载安装
>

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13368872.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-23
下一篇 2023-07-23

发表评论

登录后才能评论

评论列表(0条)

保存