在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型数组赋值的主要内容,如果未能解决你的问题,请参考以下文章

c中char型数组结束符赋值问题

C++中能否用memset将int数组元素设为-1?

char型的二维数组赋值问题?

c语言里有memset()怎么用?需要啥头文件?

一个c++有关问题,当定义一个char 型数组时,用cin循环输入为啥会出错,怎么解决,代码如下

c++用啥表示二维数组的一个数