我仍然是C的新手,我遇到了memset功能的问题.
我将一个char*传递给一个函数,在这个函数中我创建一个数组,然后使用memset来设置每个值.我一直在使用dbx来观察这个变量,因为它进入函数,并且由于某种原因它在我们传递memset后被设置为"".
首先,为什么会发生这种情况?我假设memset必须重置char*所在的内存?
其次,有没有更好的方法将每个元素设置为"0"?
这是我的代码:
static char *writeMyStr(char *myStr, int wCount) {
// here myStr is set to "My String is populated"
char **myArr;
myArr = (char **) malloc(sizeof(char *) * wCount);
memset(myArr, 0, sizeof(char *) * wCount); // myStr is set to ""
... populate array ...
}
Run Code Online (Sandbox Code Playgroud) 我正在使用OpenCL,我需要memset()一些全局设备内存中的数组.CUDA具有类似memset()API的功能,但OpenCL没有.我读了这篇文章,在那里我发现了两种可能的选择
memset()与一些临时缓冲区在主机上,然后clEnqueueWriteBuffer()该复制到设备上的缓冲区.排队(sp?)以下内核:
__kernel void memset_uint4(__ global uint4*mem,__ private uint4 val){mem [get_global_id(0)] = val; }
哪个更好?或者更确切地说,在哪种情况下/哪个平台比另一个更好?
注意:如果零记忆的特殊情况值得特别对待,那也很高兴知道.
在我目前的代码中,我有类似的东西
while(true) //Infinite loop
{
char buff[60];
.....
....
}
Run Code Online (Sandbox Code Playgroud)
我想知道什么是更好的性能明智.
memset(buff, 0, 60);或之前声明char buff(将包含包含换行符和换行符的字符串)注意:
我的要求是char每次循环重启时我都需要让数组完全干净.
我写了一个小程序来习惯memset()操作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
int main()
{
int arr[10], i;
int t = INT_MAX;
memset(arr, t, sizeof(arr));
for (i = 0; i < 10; i++)
printf("%d\t",arr[i]);
printf("%d",t);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上述计划的结果是:
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
2147483647
Run Code Online (Sandbox Code Playgroud)
memset()上述程序的行为是什么?为什么要将数组元素设置为-1?
我必须维护一个程序中有很多memset.在现代C++中使用memset是一个好习惯吗?
为什么不呢?
如果没有,memset应该更喜欢什么?
我现在正在这样做,但是
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
inet_aton("10.12.110.57", &(my_addr.sin_addr));
memset(&(my_addr.sin_zero), '\0', 8);
Run Code Online (Sandbox Code Playgroud)
我可以这样做吗?这也会将结构的其余部分归零吗?IEsin_zero[8]
struct sockaddr_in my_addr = {AF_INET, htons(MYPORT), 0};
// Or
struct sockaddr_in my_addr = {AF_INET, htons(MYPORT), {0} };
Run Code Online (Sandbox Code Playgroud) 我在tutorialspoint中遇到了以下使用memset的例子:(我不熟悉C.)
#include <stdio.h>
#include <string.h>
int main(){
char src[40];
char dest[100];
memset(dest, '\0', sizeof(dest));
strcpy(src, "This is tutorialspoint.com");
strcpy(dest, src);
printf("Final copied string : %s\n", dest);
return(0);
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么使用memset行,因为当评论该行时,编译和结果是相同的.我想问一下那条线是否必要?或者在执行strcpy()时这样做是否是一种好习惯?或者只是一条随机线.
谢谢!
我有一对对.我想在这个数组上使用memset来生成0,1或-1.我该怎么做?这是我们一直做的正常程序吗?
该对和数组是:
std::pair<int, int> ar[100][100];
Run Code Online (Sandbox Code Playgroud) unsigned char *bin_data;
unsigned char *bin_model;
bin_data = new unsigned char[200];
memset(bin_data, 0, 200);
bin_model = new unsigned char[200];
memset(bin_model, 0, 200);
Run Code Online (Sandbox Code Playgroud)
我正在审查上面的代码,我有一种直觉,它可能会导致内存泄漏,但我逻辑上找不到原因.
我认为这是因为我们将memset指向0,数据的地址可能会丢失.我们想要做的只是在从接口获取数据之前初始化bin_data和bin_model,这将用于进一步处理,因为获取数据有可能失败.
上面的代码会导致任何问题吗?
谢谢!
是
struct datainfo info = { 0 };
Run Code Online (Sandbox Code Playgroud)
与...相同
struct datainfo info;
memset(&info, 0, sizeof(info));
Run Code Online (Sandbox Code Playgroud)
有什么区别,哪个更好?
memset ×10
c ×5
c++ ×5
arrays ×1
memory ×1
memory-leaks ×1
opencl ×1
performance ×1
std-pair ×1
struct ×1