我正在挣扎memset。
如果我在数组中写入,我的程序就会崩溃。如果我注释掉memset我就没有问题。
我的类型结构:
typedef struct
{
char Frage [maxLEN_F_A];
char Antwort[maxLEN_F_A];
} Fragenfeld;
Run Code Online (Sandbox Code Playgroud)
我的结构声明:
Fragenfeld QuizFragen[maxFragen];
Fragenfeld *ptrQuizFragen = QuizFragen;
Run Code Online (Sandbox Code Playgroud)
通话memset:
memset(&ptrQuizFragen,0,maxFragen*sizeof(Fragenfeld));
Run Code Online (Sandbox Code Playgroud)
我的函数,我在其中编辑地址的值:
int Fragen_einlesen(Fragenfeld *Quizfragen)
{
....
strncpy(Quizfragen->Frage,sEingabe, maxLEN_F_A);
}
Run Code Online (Sandbox Code Playgroud) 我需要将文件中不同大小的记录归零.为此,我正在分配虚拟记录,将memset它们归零,并将它们传递给写入函数.
是否有一些区域可以保证始终为零(并且大小足够大),我可以反而指出,不需要重复分配和清零内存?
我正在尝试使用memset将枚举数组中的所有值设置为单个值,但我没有看到正确的结果.第一个memset工作,第二个没有.我的代码:
// definitions
#define NUM_THREADS 1
enum ThreadState
{
INITIALIZING,
READY_TO_CALCULATE,
CALCULATED,
READY_TO_UPDATE,
UPDATED
};
// Later on, in the code...
ThreadState Thread_States[NUM_THREADS];
// Somehow this works - after this statement, every entry in Thread_States is INITIALIZING
memset(Thread_States, INITIALIZING, NUM_THREADS* sizeof(ThreadState));
// ... later on (or even immediately right after) ...
// Failure - after this statement, every entry in Thread_States is 16843009
memset(Thread_States, READY_TO_CALCULATE, NUM_THREADS* sizeof(ThreadState));
Run Code Online (Sandbox Code Playgroud)
正如评论中所解释的那样,我第一次调用memset时,值被设置为我期望的值(INITIALIZING,即0).当我运行第二个语句时,我没有看到值设置为READY_TO_CALCULATE(即1).相反,当我检查调试器时,它们被设置为16843009.
有没有理由相对简单地使用memset的行为不一致?
谢谢.
我正在尝试编译本页末尾提供的完整示例8:http://www.physics.wisc.edu/~craigm/idl/cmpfit.html
但我收到此错误:错误:'memset'未在此范围内声明
我一直在寻找如何解决这个错误,我看到有些人通过添加#include <string.h>到代码的头部来解决它.我尝试过,但我仍然得到同样的错误.
我在Ubuntu 12.04 LTS上使用gcc版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5)
我正在尝试编译:
g++ -o example example.cpp -lmpfit -lm
Run Code Online (Sandbox Code Playgroud) AFAIK,在swift中,调用类/结构的默认初始化器会将所有内容初始化为0,nil.在C(例如套接字编程)中,有时memset用于在使用struct之前将所有内容设置为0.我是否需要在swift中使用memset,或者我写它的方式很好?
(BTW,在这种情况下memset使用是因为hints除了2个参数以外应该设置为0.非0(垃圾等)res在调用时会产生副作用getaddrinfo.
struct addrinfo hints, *res;
int status;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
status = getaddrinfo(NULL, MYPORT, &hints, &res);
Run Code Online (Sandbox Code Playgroud)
var res = UnsafeMutablePointer<addrinfo>()
var hints = addrinfo()
hints.ai_family = AF_UNSPEC
hints.ai_socktype = SOCK_STREAM
let status = getaddrinfo(nil, MYPORT, &hints, &res)
Run Code Online (Sandbox Code Playgroud) 我按照如何memset char数组与空终止字符?使用C memsetapi 时添加空终止符.
代码有效; 由于null终止符,我不再在malloc'd char数组的末尾添加奇怪的内存中字符.
/* memset does not add a null terminator */
static void yd_vanilla_stars(size_t *number_of_chars, char *chars_to_pad)
{
memset(chars_to_pad, 0, *number_of_chars+1);
memset(chars_to_pad,'*',*number_of_chars);
}
Run Code Online (Sandbox Code Playgroud)
是否有更优雅的方式实现同样的目标?
假设我有一个全局声明的3d数组(在数据段中),我想将其1d memset为0.
int multi_dimension_array[x][y][z];
Run Code Online (Sandbox Code Playgroud)
我可以用线条记住整个事情:
memset(multi_dimension_array, 0, sizeof(multi_dimension_array));
Run Code Online (Sandbox Code Playgroud)
但是现在假设我只想将x维度设置为某个值(比如2),这意味着multi_dimension_array [2] [0] [0]到multi_dimension_array [2] [y-1] [z-1]的值应该全部为零.我不认为这是一个聪明的方法来使用memset y或z,因为它们不是连续的.以下行应该有效:
memset(&multi_dimension_array[2][0][0], 0, sizeof(multi_dimension_array[2][0][0]) * y * z);
Run Code Online (Sandbox Code Playgroud)
我的"问题"是我不喜欢memset param的*y*z部分.数组中是否存在sizeof(multi_dimension_array [2])== byte_size_of_type*y*z?
我想使用sizeof将在此示例中评估为"x"维度的正确字节数的数组属性.我不想在有人改变声明中的大小并且他们不改变这个memset的情况下使用*y*z,而且我不喜欢它看起来如何.
由于std :: complex是非平凡的类型,请使用GCC 8.1.1编译以下内容
complex<double>* z = new complex<double>[6];
memset(z,0,6*sizeof*z);
delete [] (z);`
Run Code Online (Sandbox Code Playgroud)
产生警告
清除非平凡类型的对象
我的问题是,这样做实际上有潜在的危害吗?
我写了一些代码来看看如何malloc()和memset()表现,我发现了一个我不知道发生了什么的情况.
我曾经malloc()为字符数组分配15个字节的内存,我想看看如果我memset()错误地在我创建的指针中设置了100个字节的内存会发生什么.我希望看到它memset()设置了15个字节(并且可能会丢弃一些其他内存).我在运行程序时看到的是它为我编码的字符设置了26个字节的内存.
知道为什么为我创建的指针分配了26个字节?我正在用gcc和glibc编译.这是代码:
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#define ARRLEN 14
int main(void) {
/* + 1 for the null terminator */
char *charptr = malloc((sizeof(*charptr) * ARRLEN) + 1);
if (!charptr)
exit(EXIT_FAILURE);
memset(charptr, '\0', (sizeof(*charptr) * ARRLEN) + 1);
/* here's the intentionally incorrect call to memset() */
memset(charptr, 'a', 100);
printf("sizeof(char) ------ %ld\n", sizeof(char));
printf("sizeof(charptr) --- %ld\n", sizeof(charptr));
printf("sizeof(*charptr) --- %ld\n", sizeof(*charptr));
printf("sizeof(&charptr) --- %ld\n", …Run Code Online (Sandbox Code Playgroud)