在c++中怎么用memset() 给二维char型数组赋值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c++中怎么用memset() 给二维char型数组赋值相关的知识,希望对你有一定的参考价值。
Memset一般都是按字节进行赋值,都是给字符型数组赋初值。给字符型数组赋值的知识及问题可以见百度百科:http://baike.baidu.com/view/982208.htm。我们主要讲解给非字符型数组如int的一维或二维数组初始化为0的操作。需要的头文件:<memory.h>or <string.h>一维数组赋值0:
[cpp] view plain copy print?
int a[5];
memset(a,0,5*sizeof(int));
//// memset 是按字节进行赋值,一般对非字符型数组进行赋初值是不可取的 除了赋值0操作
或者写为memset(a, 0, sizeof(a)); sizeof(a) 就等于5*sizeof(int) = 20;
如果 是 int*p = new int[5]; 那么sizeof(p) 就等于4 == sizeof(int*) 包括double*,void* 或者类类型指针等的字节数都为4 (对于32位系统而言,64位系统则是8)
此外对于动态以为数组 int*a = new int[5]; memset(a, 0, sizeof(int)*5)也是可以的。
二维数组赋值0:
[cpp] view plain copy print?
int a[4][4];
cout << sizeof(a) << endl; // 对二维数组赋值0操作,对于动态二维数组不能这样处理
memset(a, 0, sizeof(a));
动态二维数组赋值0:
[cpp] view plain copy print?
long **F = new long*[height];
int i,j;
for(i = 0; i < height; i++)
F[i] = new long[allStates];
memset(F[i], 0, sizeof(long)*allStates); // 二维动态数组可以这样初始化
直接对于动态二维数组memset(F, 0, sizeof(long)*allStates*height);是不行的,因为动态二维数组申请的空间不一定是连续的,,F指向的空间不连续,这样赋值就会出错。 参考技术A char array[10][20];
给每个char数值清零:
方法一:memset(array, 0, sizeof(array)); //array不能是指针
方法二:for(int i=0; i<10; i++) memset(array[i], 0, 20);追问
我一开始也用的方法一,结果输出是大段空白
这是代码
int main()
char table[1000][15];memset(table,-1,sizeof(table));for(int i;i<1000;i++)cout<<endl;for(int j;j<1000;j++)cout<<table[i][j];system("pause");return 0;
把for(int j; j<1000; j++)修改成
for(int j; j<15; j++)
改过了,可还是不行
追答说错了。执行for的时候需要初始化变量。
把for(int j; 改成for(int i=0;
仍然不行
转化成int型输出还是不行
截图看看。
参考技术B 刚刚没有注意到是二维char buf[5][10];
memset(buf,0,sizeof(buf));
函数原型
void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 参考技术C char ch[5][5];
memset (ch[0],0,_countof(ch));
memset (ch[0],0,sizeof(ch)); 参考技术D 如果你定义的是
char data[55][2];
可以用
memset(data,0,sizeof(data));
C++中char指针中的memset的分段错误(核心转储)[重复]
【中文标题】C++中char指针中的memset的分段错误(核心转储)[重复]【英文标题】:Segmentation fault (core dumped) with memset in char pointer in C++ [duplicate] 【发布时间】:2017-11-03 21:42:04 【问题描述】:我有两个版本的代码。一个有效,另一个无效。
工作代码如下:
int main()
int i;
char str[] = "Hello World";
std::cout<<"The string value before memset is : "<<str<<std::endl;
memset (str,'-',6);
std::cout<<"The string value after memset is : "<<str<<std::endl;
return 0;
它给出了预期的输出:
The string value before memset is : Hello World
The string value after memset is : ------World
现在,我有另一个版本的代码,我想在其中使用 char 指针,但这段代码不起作用。我得到以下输出:
int main()
char *str;
str = "Hello World";
std::cout<<"The string value before memset is : "<<str<<std::endl;
memset (str,'-',6);
std::cout<<"The string value after memset is : "<<str<<std::endl;
return 0;
The string value before memset is : Hello World
Segmentation fault (core dumped)
我只是不知道发生了什么。你能帮我解决这个问题吗?
【问题讨论】:
“我有另一个版本的代码” - 给我们看看! 大声笑 - 你展示了有效的代码,而不是失败的代码! 我知道它在说什么 - 它说char *str = "Hello World"
字符串字面量是常量。您不能也不应该修改它们。这就是为什么在声明指向它们的指针时应该始终使用const char*
。
@enjal 那是因为你不应该修改数据!指针指向的文字字符串是 constant.
【参考方案1】:
你用的是什么编译器?那不应该编译,因为“Hello World”是一个 const char[12],它会衰减为 const char*。在 C++ 中,将 const char* 分配给 char* 是无效的,因为没有强制转换就不能丢失 const。修改 const 数据是未定义的行为,因此崩溃是合理的。 (通常字符串文字被放置在只读内存段中,因此如果您写入它们可能会崩溃(但这是编译器细节,而不是语言。))
如果要修改数据,必须将字符串文字复制到自己的内存中。你的第一个是一种有效的方法。
【讨论】:
【参考方案2】:我猜你有
char *str = "Hello world";
在您失败的代码中。 memset
失败,因为 str
是指向常量字符串的指针。不允许更改常量字符串。
在那个有效的地方
char str[] = "Hello World";
将常量字符串复制到局部变量中。您可以更改它。
【讨论】:
我必须在指针版本中工作。 @enjal :然后“Yousa 搞砸了”,冈根人说。如果不调用未定义行为的怪异行为,就无法写入常量内存。 你的意思是'我必须使用指针'?以上是关于在c++中怎么用memset() 给二维char型数组赋值的主要内容,如果未能解决你的问题,请参考以下文章