在尝试重新创建“memset”函数时,如果我尝试取消引用 void 指针,或者第二个参数的类型与第一个参数的类型不同,则会出错。为了使该功能正常工作,我必须将其更改为:
void ft_memset(unsigned char *st, unsigned char c, size_t n)
Run Code Online (Sandbox Code Playgroud)
是否可以像手册中那样定义该功能?
void *memset(void *s, int c, size_t n) <- This is the man version.
Run Code Online (Sandbox Code Playgroud)
我只使用库 stdio.h 来使用 size_t 我必须使用 -Wall -Wextra -Werror 进行编译
这是我的代码:
#include <stdio.h>
//stdio.h to use size_t;
//
void *ft_memset(unsigned char *str, unsigned char c, size_t n)
{
unsigned int i;
i = 0;
while (i < n)
{
str[i] = c;
i++;
}
return(str);
}
Run Code Online (Sandbox Code Playgroud) 我正在写一个内存分配器,我需要一种方法来存储一块内存中的整数.这个整数将代表块的大小,所以我可以导航到指向开头的指针.
这是我的测试示例:
//编辑:testInt的声明空间int*testInt = new int;
head_ptr = (char*) malloc(4*1024*1024); // Allocate 4MB
// EDIT: Should have used std::fill and std::copy
memset(head_ptr,23,sizeof(int)); // Set Address head_ptr = 12345
memcpy(testInt,head_ptr,sizeof(int)); // Set testInt = head_ptr
printf("testInt = %i",testInt);
Run Code Online (Sandbox Code Playgroud)
这会在倒数第二行引发分段错误.
我想做的事情有意义吗?
如果是这样,那么正确的方法是什么?
非常感谢大家的帮助!! 问题解决了 :-)
我想将派生结构的所有成员归零.
每隔一段时间就有数百个成员和更多成员被添加,所以我觉得明确地初始化它们容易出错.
结构没有虚函数,所有成员字段都是内置的.然而,由于具有非平凡的构造函数,它们不是POD.
除了练习的标准皱眉外,您是否看到以下任何问题?
struct Base
{
// Stuff
};
struct Derived : public Base
{
// Hundreds of fields of different built-in types
// including arrays
Derived()
{
::memset(reinterpret_cast<char*>this + sizeof (Base), 0, sizeof *this - sizeof (Base));
}
};
Run Code Online (Sandbox Code Playgroud)
谢谢.
使用2D数组的int,一切都很好:
int **p = new int*[8];
for (int i = 0; i < 8; i++)
p[i] = new int[8];
memset(p, 0, 64 * sizeof(int))
Run Code Online (Sandbox Code Playgroud)
但是使用二维数组的字符,我得到一个运行时错误
char **p = new char*[8];
for (int i = 0; i < 8; i++)
p[i] = new char[8];
memset(p, 0, 64 * sizeof(char));
Run Code Online (Sandbox Code Playgroud)
我的代码出了什么问题?
如何为指向数组的指针执行memset?
int (*p)[2];
p=(int(*))malloc(sizeof(*p)*100);
memset(p,0,sizeof(*p)*100);
Run Code Online (Sandbox Code Playgroud)
这个分配是正确的吗?
这是原型:
void *memset(void *s, int c, size_t n)
Run Code Online (Sandbox Code Playgroud)
首先我不确定我是否必须返回一些东西,因为当我使用memset时,例如
memset(str, 'a', 5);
Run Code Online (Sandbox Code Playgroud)
代替
str = memset(str, 'a', 5);
Run Code Online (Sandbox Code Playgroud)
这是我的代码所在:
void *my_memset(void *b, int c, int len)
{
int i;
i = 0;
while(b && len > 0)
{
b = c;
b++;
len--;
}
return(b);
}
int main()
{
char *str;
str = strdup("hello");
my_memset(str, 'a', 5);
printf("%s\n", str);
}
Run Code Online (Sandbox Code Playgroud)
我不想在这个函数中使用数组,以更好地理解指针和内存,所以我没有得到2件事: - 如何将int c复制到我的void b指针上的一个字符 - 我要用什么条件来确定它在'\ 0'字符之前停止
编辑:我想知道有没有办法在没有投射的情况下执行此功能?
我不认为我在这里有所了解......
bool (*lookup)[100];
memset(lookup, 0, 100 * sizeof(*lookup));
Run Code Online (Sandbox Code Playgroud)
我正在尝试初始化指向堆栈分配数组的指针(指针只会传递给堆栈帧内的调用).memset用于将数组初始化为0.
前面的代码会导致段错误,memset不像指针吗?
我这样使用memset:
class A {
public:
A();
private:
int a;
float f;
char str[35];
long *lp;
};
A::A()
{
memset(this, 0, sizeof(*this));
}
}
Run Code Online (Sandbox Code Playgroud)
我应该用这种方式吗?为什么不呢?有没有更好的办法?需要一些指导..
我无法弄清楚我从这里得到分段错误似乎是什么问题:
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
void alloc(unsigned char *data) {
data = (unsigned char *) malloc(20);
memset(data, 0, 20);
}
void main() {
unsigned char *data = NULL;
int i;
alloc(data);
for (i = 0; i < 20; i++) {
data[i] = i;
printf("%d ", *(data + i));
}
free(data);
}
Run Code Online (Sandbox Code Playgroud)
无符号字符是1个字节,因此循环20应该是正确的
我阅读了以下代码片段:
va_list args;
memset(&args, 0, sizeof(va_list));
va_start(args, xxx);
...
va_end(args);
Run Code Online (Sandbox Code Playgroud)
这memset()之前有va_start()什么含义?
如果memset()拆除线路有什么区别?