程序在 memset 上崩溃?
Program crash on memset?
我正在努力 memset
。
如果我在数组中写入,我的程序就会崩溃。如果我注释掉 memset
我没有问题。
我的类型结构:
typedef struct
{
char Frage [maxLEN_F_A];
char Antwort[maxLEN_F_A];
} Fragenfeld;
我的结构声明:
Fragenfeld QuizFragen[maxFragen];
Fragenfeld *ptrQuizFragen = QuizFragen;
memset
调用:
memset(&ptrQuizFragen,0,maxFragen*sizeof(Fragenfeld));
我的函数,我在其中编辑地址的值:
int Fragen_einlesen(Fragenfeld *Quizfragen)
{
....
strncpy(Quizfragen->Frage,sEingabe, maxLEN_F_A);
}
写的时候
memset(&ptrQuizFragen,0,maxFragen*sizeof(Fragenfeld));
你是说“请将很多字节 从指针变量 ptrQuizFragen
的地址开始设置为零。”请注意,这不同于说“请将很多字节 从 ptrQuizFragen
指向的数组的开头开始设置为零。”这意味着字节被写入错误的位置,这就是导致您的段错误的原因。
从图形上看,设置如下所示:
ptrQuizFragen
+-----------+
| |
+-----------+
|
v
+-----------+-----------+-----------+ ... +-----------+
| | | | | |
+-----------+-----------+-----------+ ... +-----------+
QuizFragen
您所写的行将字节从内存中 ptrQuizFragen
所在的位置开始,这样做是这样的:
ptrQuizFragen
+-----------+
| 00000000000000000000000000000000000 ... 000000000000 (oops!)
+-----------+
+-----------+-----------+-----------+ ... +-----------+
| | | | | |
+-----------+-----------+-----------+ ... +-----------+
QuizFragen
您要的线路是
memset(ptrQuizFragen, 0, maxFragen * sizeof(Fragenfeld));
表示将字节放在ptrQuizFragen
指向的内存位置。那会这样做:
ptrQuizFragen
+-----------+
| |
+-----------+
|
v
+-----------+-----------+-----------+ ... +-----------+
| 000000000 | 000000000 | 000000000 | | 000000000 |
+-----------+-----------+-----------+ ... +-----------+
QuizFragen
这个...
memset(&ptrQuizFragen,0,maxFragen*sizeof(Fragenfeld));
...请求写入变量ptrQuizFragen
地址开始的内存,但是你想要的是指针指向的位置的内存被写入:
memset(ptrQuizFragen, 0, maxFragen*sizeof(Fragenfeld));
或者,出于与初始化 ptrQuizFragen
相同的原因,您也可以完全取消它:
memset(QuizFragen, 0, maxFragen*sizeof(Fragenfeld));
此外,直接根据写入的对象来表达想要的大小会更清楚:
memset(QuizFragen, 0, sizeof(QuizFragen));
但是,如果这是一次性初始化,那么我根本不会使用 memset
:
Fragenfeld QuizFragen[maxFragen] = {0};
虽然这是具有定义明确的语义的有效 C,但某些编译器可能会发出警告。如果你这样做了,这让你不舒服,那么另一种选择是扩大一点到
Fragenfeld QuizFragen[maxFragen] = { { {0}, {0} } };
我正在努力 memset
。
如果我在数组中写入,我的程序就会崩溃。如果我注释掉 memset
我没有问题。
我的类型结构:
typedef struct
{
char Frage [maxLEN_F_A];
char Antwort[maxLEN_F_A];
} Fragenfeld;
我的结构声明:
Fragenfeld QuizFragen[maxFragen];
Fragenfeld *ptrQuizFragen = QuizFragen;
memset
调用:
memset(&ptrQuizFragen,0,maxFragen*sizeof(Fragenfeld));
我的函数,我在其中编辑地址的值:
int Fragen_einlesen(Fragenfeld *Quizfragen)
{
....
strncpy(Quizfragen->Frage,sEingabe, maxLEN_F_A);
}
写的时候
memset(&ptrQuizFragen,0,maxFragen*sizeof(Fragenfeld));
你是说“请将很多字节 从指针变量 ptrQuizFragen
的地址开始设置为零。”请注意,这不同于说“请将很多字节 从 ptrQuizFragen
指向的数组的开头开始设置为零。”这意味着字节被写入错误的位置,这就是导致您的段错误的原因。
从图形上看,设置如下所示:
ptrQuizFragen
+-----------+
| |
+-----------+
|
v
+-----------+-----------+-----------+ ... +-----------+
| | | | | |
+-----------+-----------+-----------+ ... +-----------+
QuizFragen
您所写的行将字节从内存中 ptrQuizFragen
所在的位置开始,这样做是这样的:
ptrQuizFragen
+-----------+
| 00000000000000000000000000000000000 ... 000000000000 (oops!)
+-----------+
+-----------+-----------+-----------+ ... +-----------+
| | | | | |
+-----------+-----------+-----------+ ... +-----------+
QuizFragen
您要的线路是
memset(ptrQuizFragen, 0, maxFragen * sizeof(Fragenfeld));
表示将字节放在ptrQuizFragen
指向的内存位置。那会这样做:
ptrQuizFragen
+-----------+
| |
+-----------+
|
v
+-----------+-----------+-----------+ ... +-----------+
| 000000000 | 000000000 | 000000000 | | 000000000 |
+-----------+-----------+-----------+ ... +-----------+
QuizFragen
这个...
memset(&ptrQuizFragen,0,maxFragen*sizeof(Fragenfeld));
...请求写入变量ptrQuizFragen
地址开始的内存,但是你想要的是指针指向的位置的内存被写入:
memset(ptrQuizFragen, 0, maxFragen*sizeof(Fragenfeld));
或者,出于与初始化 ptrQuizFragen
相同的原因,您也可以完全取消它:
memset(QuizFragen, 0, maxFragen*sizeof(Fragenfeld));
此外,直接根据写入的对象来表达想要的大小会更清楚:
memset(QuizFragen, 0, sizeof(QuizFragen));
但是,如果这是一次性初始化,那么我根本不会使用 memset
:
Fragenfeld QuizFragen[maxFragen] = {0};
虽然这是具有定义明确的语义的有效 C,但某些编译器可能会发出警告。如果你这样做了,这让你不舒服,那么另一种选择是扩大一点到
Fragenfeld QuizFragen[maxFragen] = { { {0}, {0} } };