fill和memset 数组填充跟数组初始化

一般我们在使用memset来初始化数组,但是昨天在做一道题时,死活出错,原因在于我想把一个int数组初始化为最大整型数,下面是memset函数原型

void *memset(void *s, int ch, size_t n)

功能是:(直接从百度百科抄过来)

将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,

这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针

注意:这边是对前n个字节进行赋值,而且还是ASCII的形式,那就是说,对于字符数组,可以将其初始化为任意一个字符,那对于其他基础类型的数组呢?

那只能说一声抱歉了,因为memset按字节对内存块进行初始化,所以他无法对int数组初始化除了0和-1以后的其他数

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
	int a[20];
	int b[20];
	int c[20];
	int d[20];
	memset(a,0,sizeof(a));			//right 初始化为0  
	memset(b,-1,sizeof(b));    		//right 初始化为-1 
	memset(c,1,sizeof(c));			//wrong 
	memset(d,2,sizeof(d));			//wrong 
	for(int i=0;i<10;i++) cout<<a[i]<<"  ";  cout<<endl;
	for(int i=0;i<10;i++) cout<<b[i]<<"  ";  cout<<endl;
	for(int i=0;i<10;i++) cout<<c[i]<<"  ";  cout<<endl;
	for(int i=0;i<10;i++) cout<<d[i]<<"  ";  cout<<endl;
	return 0;
} 
这个例子输出结果为:


所以小伙伴们在使用memset函数要注意这些

接下来介绍 fill函数

函数参数 fill(first,last,val)

first,last 对应数组的范围,val为元素的值

fill 顾名思义 这个函数是用来填充的,例如我们想对一个数组赋值,那么

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
	int a[20];
	int b[20];
	char c[20];
	float d[20];
	fill(a,a+11,1);				//赋值1 
	fill(b,b+11,2147483647);	//赋值最大整型 2147483647
	fill(c,c+11,'*');			//赋值 * 
	fill(d,d+11,0.1);			//赋值 0.1 
	for(int i=0;i<10;i++) cout<<a[i]<<"   ";  cout<<endl;
	for(int i=0;i<8;i++) cout<<b[i]<<"   ";  cout<<endl;
	for(int i=0;i<10;i++) cout<<c[i]<<"   ";  cout<<endl;
	for(int i=0;i<10;i++) cout<<d[i]<<"   ";  cout<<endl;
	return 0;
} 
运行结果为:


所以当我们想对数组赋值时,使用fill 函数还是比较方便的

<think>好的,我现在需要回答用户关于如何在C++中使用fill函数初始化二维数组的问题。根据用户提供的引用,特别是引用[2],里面提到了C++fill函数二维数组初始化方法。首先,我得回忆一下fill函数的基本用法。 fill函数属于C++标准库中的算法部分,位于<algorithm>头文件中。它的作用是用一个特定的值填充一个范围内的元素。对于一维数组,使用起来比较直接,例如fill(arr, arr + n, value)。但是对于二维数组,情况稍微复杂一些,因为二维数组在内存中是连续存储的,所以理论上可以用fill来处理,但需要注意正确的内存范围。 用户提到的是二维数组,所以需要确定二维数组的类型。如果是静态分配的二维数组,比如int arr[3][4];,那么内存布局是连续的,可以用fill填充整个数组。这时候,可以取首元素的地址,然后计算整个数组的大小。例如,fill(&arr[0][0], &arr[0][0] + 3*4, 0),这里3是行数,4是列数,这样就能把整个二维数组初始化为0。 另一种情况是使用动态数组,比如用指针数组指向多个一维数组。这时候每个一维数组可能是独立分配的内存块,这时候无法用一次fill处理整个二维数组,必须对每一行分别调用fill。例如,对于int **arr = new int*[3];,然后每一行arr[i] = new int[4];,这时候需要循环每一行,使用fill(arr[i], arr[i] + 4, value)。 接下来要检查用户提供的引用内容。引用[2]中的示例是关于C的多维数组声明,但用户问的是C++fill函数。引用中的代码示例可能不太相关,但用户提供的引用[2]的标题提到了“c++ fill 二维数组初始化”,因此需要确认是否正确。可能在原引用中,作者确实讨论了C++fill函数用于二维数组的情况。 需要确保给出的示例代码正确无误。例如,静态二维数组的正确初始化方法,以及动态数组的处理方式。此外,需要注意指针内存范围的计算是否正确,避免越界。 另外,用户可能需要知道fill函数与memset的区别,但用户的问题明确提到fill函数,所以重点放在fill的使用上。同时,提醒用户注意,对于非POD类型,使用fill更安全,而memset可能不适用。 总结步骤: 1. 包含必要的头文件<algorithm>。 2. 确定二维数组的类型(静态或动态)。 3. 对于静态数组,使用首元素地址总元素数来确定范围。 4. 对于动态数组的每一行,单独调用fill。 5. 提供示例代码,并解释每部分的作用。 6. 可能提到注意事项,如内存连续性类型安全。 现在需要验证这些步骤是否正确。例如,静态二维数组是否真的连续存储?在C/C++中,静态多维数组确实是按行优先连续存储的,所以可以用一个fill调用来初始化。而动态数组如果每一行是独立分配的,则内存不连续,必须逐行处理。这些都需要在回答中明确指出。 最后,根据用户提供的引用,引用[2]中的内容可能已经涉及到这一点,所以需要正确引用。例如,指出根据引用[2],多维数组的存储方式允许fill函数一次性填充。 现在可以组织答案,分静态动态两种情况,给出示例代码,并引用相关文献。</think>在C++中使用`fill`函数初始化二维数组时,需根据数组类型(静态或动态)选择不同的方法。以下是具体实现步骤示例: --- ### **1. 静态二维数组初始化** 静态二维数组在内存中是**连续存储**的,可以通过计算总元素数量直接初始化。 **示例代码**: ```cpp #include <algorithm> // 包含fill函数 int main() { int arr[3][4]; // 声明3行4列的静态二维数组 // 使用fill初始化所有元素为0 std::fill(&arr[0][0], &arr[0][0] + 3 * 4, 0); } ``` **解释**: - `&arr[0][0]`是数组首元素地址,`3*4`是总元素数量。 - 通过首地址总元素数确定填充范围,实现全数组初始化[^2]。 --- ### **2. 动态二维数组初始化** 动态二维数组若为**指针数组**(每行独立分配内存),需逐行初始化: **示例代码**: ```cpp #include <algorithm> int main() { int rows = 3, cols = 4; int **arr = new int*[rows]; // 动态分配行指针 for (int i = 0; i < rows; i++) { arr[i] = new int[cols]; // 每行分配空间 std::fill(arr[i], arr[i] + cols, 1); // 初始化当前行为1 } } ``` **解释**: - 对每行单独调用`fill`,因为不同行的内存可能不连续[^2]。 --- ### **注意事项** 1. **内存连续性**:静态数组可直接填充;动态数组需确认存储方式(如`vector<vector<int>>`需逐行填充)。 2. **与`memset`区别**:`fill`支持任意数据类型(如类对象),而`memset`仅适用于POD类型(如基本类型)。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值