【问题标题】:Program crash on memset?memset上的程序崩溃?
【发布时间】:2021-03-14 17:13:16
【问题描述】:

我正在为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);
}

【问题讨论】:

  • &ptrQuizFragen 应该只是 ptrQuizFragen。想一想

标签: c pointers memset


【解决方案1】:

当你写作时

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

【讨论】:

  • 我喜欢你对正在发生的事情的图形说明。
  • :)这个非常有用的答案!
【解决方案2】:

这...

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} } };

【讨论】:

    猜你喜欢
    • 2022-10-08
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多