关于内存地址分配之几个注意事项
来源:互联网 发布:苹果手机远程抹除数据 编辑:程序博客网 时间:2024/04/30 08:00
根据牛客网的题目
总结了在分配内存事的几个注意事项,
1,注意分配内存的大小,防止数组越界,
ps 主要考察就是\0相关的知识, 数组必须留一位给\0 以便标识数组结束,所以划分数组大小的时候需要注意,
在c++中使用strcpy()函数的时候,要注意该函数会一直拷贝
,直到遇到\0为止,所以为了防止越界,数组末尾记得要留一个地址给\0
分析下面代码有什么问题?
1
2
3
4
5
6
void
test1()
{
char
string[10];
char
* str1 =
"0123456789"
;
strcpy
( string, str1 );
}
字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界;
分析下面代码有什么问题?
1
2
3
4
5
6
7
8
9
10
void
test2()
{
char
string[10], str1[10];
int
i;
for
(i=0; i<10; i++)
{
str1 =
'a'
;
}
strcpy
( string, str1 );
}
首先,代码根本不能通过编译。因为数组名str1为 char *const类型的右值类型,根本不能赋值。
再者,即使想对数组的第一个元素赋值,也要使用 *str1 = 'a';
其次,对字符数组赋值后,使用库函数strcpy进行拷贝操作,strcpy会从源地址一直往后拷贝,直到遇到'\0'为止。所以拷贝的长度是不定的。如果一直没有遇到'\0'导致越界访问非法内存,程序就崩了。
完美修改方案为:
1
2
3
4
5
6
7
8
9
10
11
void
test2()
{
char
string[10], str1[10];
int
i;
for
(i=0; i<9; i++)
{
str1[i] =
'a'
;
}
str1[9] =
'\0'
;
strcpy
( string, str1 );
}
指出下面代码有什么问题?
1
2
3
4
5
6
7
8
9
10
11
void
test3(
char
* str1)
{
if
(str1 == NULL){
return
;
}
char
string[10];
if
(
strlen
( str1 ) <= 10 )
{
strcpy
( string, str1 );
}
}
0 0
- 关于内存地址分配之几个注意事项
- 关于内存分配的几个例子
- 关于内存分配的几个原则
- C语言基础之--------内存地址分配
- 内存地址,内存分配
- 内存地址分配
- 内存地址分配
- 内存 地址 分配
- 分配偶数地址内存
- 内存 地址 分配
- 内存地址分配规则
- 内存 地址 分配
- appropriately分配内存地址
- DELPHI之关于String的内存分配
- 内存分配malloc函数注意事项。
- Android内存分配的注意事项
- windows几个内存分配函数
- 内存地址分配 (转载)
- git 常用命令
- Xcode项目横竖屏切换控件元素无法响应用户操作的原因及解决
- Part06
- 原生APP集成身份证扫描拍照识别SDK
- LeetCode-Easy部分中标签为 Binary Search 278. First Bad Version
- 关于内存地址分配之几个注意事项
- 解决java.lang.NullPointerException: View must not be null!
- [BZOJ]1027 合金
- hdoj-1040-As Easy As A+B(解题报告)
- Part07
- 基数排序算法
- 7种结构型模式之:享元模式(Flyweight)与数据库连接池的原理
- java中线程的理解
- [BZOJ]1030 文本生成器