#include <stdio.h>
#include <string.h>
int main(void){
char s1[30]="abcdefghijklmnopqrstuvwxyz";
printf("%s\n",s1);
printf("%s",memset(s1,'b',7));
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码有效,但是当我像这样创建 s1 数组时,
char *s1="abcdefghijklmnopqrstuvwxyz";
Run Code Online (Sandbox Code Playgroud)
它不会在编译时出现任何错误,但无法在运行时运行。
我正在使用 Visual Studio 2012。
你知道为什么吗?
我发现 memset 的原型是:
void *memset( void *s, int c, size_t n );
Run Code Online (Sandbox Code Playgroud) 我想避免memset()
在这样的结构上使用:
typedef struct {
int size;
float param1;
} StructA;
typedef struct {
StructA a;
unsigned int state;
float param2;
} Object;
Run Code Online (Sandbox Code Playgroud)
我可以做这样的事情(伪代码,我现在无法检查)?
Object obj;
int *adr = (int*)&obj;
for (int i; i < sizeof(obj); i++) {
*adr++ = 0;
}
Run Code Online (Sandbox Code Playgroud)
它会将obj的每个成员设置为零吗?
编辑:回答评论问题.我一直在研究一些情况(使用uni-type结构),其memset
速度比手动初始化慢两倍.所以我会考虑尝试初始化多类型结构.
避免memcpy()
也会很好(避免使用<string.h>
lib).
我试图清除矢量中的所有数据而不改变其大小memset
.但是在memset
操作后,vector的大小变为0.这是确切的代码:
std::vector<T> buckets[2];
MAX_BUCKET_SIZE=16;
Run Code Online (Sandbox Code Playgroud)
构造函数:
buckets[0].resize(MAX_BUCKET_SIZE);
std::cout << "Actual size0 " << buckets[0].size() << std::endl;
buckets[1].resize(MAX_BUCKET_SIZE);
std::cout << "Actual size1 " << buckets[1].size() << std::endl;
Run Code Online (Sandbox Code Playgroud)
在一个功能:
std::cout << "Actual size2 0 " << buckets[0].size() << std::endl;
std::cout << "Actual size2 1 " << buckets[1].size() << std::endl;
...
...
while (...){
delete_data(current_bucket);
std::cout << "current bucket ** " << current_bucket << std::endl;
std::cout << "Actual size3 0 " << buckets[0].size() << std::endl;
std::cout << "Actual size3 1 …
Run Code Online (Sandbox Code Playgroud) int color[1001][1001];
int m,n;
m=10;
n=10;
memset(color,0,sizeof(color));
memset(color,0,sizeof(color[0][0])*m*n );
Run Code Online (Sandbox Code Playgroud)
这两个memset语句有什么区别?
任何答案都将受到高度赞赏.提前致谢.
我想double
动态声明一个类型数组,所以这是我的代码
void function(int length, ...)
{
...
double *a = malloc(sizeof(double) * length);
memset(a, 1, sizeof(double) * length);
for (int i = 0; i < length; i++)
{
printf("%f", a[i]);
}
...
}
Run Code Online (Sandbox Code Playgroud)
当我通过length
时2
,代码不会打印所有1.它只打印以下内容:
7.7486e-304
7.7486e-304
Run Code Online (Sandbox Code Playgroud)
那么,我该怎么做才能修复它?
我是C的前任,所以请耐心等待我; 我知道我可以将数组语句作为*c
或c[]
;
我的问题是关于memset:
char str[] = "hello!";
memset (str,'-',2);
puts (str);
Run Code Online (Sandbox Code Playgroud)
工作良好.但:
char *str = "hello!";
memset (str,'-',2);
puts (str);
Run Code Online (Sandbox Code Playgroud)
不工作,我知道char *str = ...
是一个正常的数组语句.
如果有人可以帮我这个,我谢谢你!
在以下代码中,函数const
清除数组的元素memset
.
#include <stdio.h>
#include <string.h>
int main() {
const int a[3] = {1, 2, 3};
memset(a, 0, sizeof(a));
printf("%d %d %d\n",a[0],a[1],a[2]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
memset
在const
阵列上使用是合法的吗?
目前正在使用我的DirectX游戏并在常量缓冲区构造函数中使用memset(0)(或VS中的ZeroMemory宏)来使用零初始化所有值,并且它可以正常工作.当我不小心尝试以这种方式初始化包含向量的其他结构时出现问题.根据编译器(VS2010/VS2012),这会导致"矢量迭代器不兼容",std :: vector :: end更加精确.我可以理解memset可能会使向量迭代器无效,但是在我将元素推回到向量之后,为什么"结束"迭代器无法正常工作.它不应该重新定位向量将迭代器结束到正确的位置(在最后一个元素之后)?所有类型的std :: some_container :: end迭代器都受此影响了吗?
#include <vector>
class MyClass
{
public:
MyClass() {
memset(this, 0, sizeof(*this));
}
~MyClass() {}
std::vector<int>& GetData() { return m_data; }
float m_range;
private:
std::vector<int> m_data;
};
int main()
{
MyClass myClass;
myClass.GetData().push_back(1);
myClass.GetData().push_back(2);
for (auto it = myClass.GetData().begin(); it != myClass.GetData().end(); it++)
{
//stuff
}
}
Run Code Online (Sandbox Code Playgroud)