【问题标题】:Error while putting something in my array. C将某些东西放入我的数组时出错。 C
【发布时间】:2017-01-22 11:02:05
【问题描述】:

我的程序 (Eclipse Neon) 在我运行程序时崩溃。我找到了问题所在,但我不知道如何解决。

首先我创建一个动态数组:

int nLeden = 0;
AtletiekLid *ledenArray = (AtletiekLid *)calloc(nLeden, sizeof(AtletiekLid));

使用这个结构:

typedef struct {
    char naam[30];
    unsigned leeftijd;
} AtletiekLid;

之后我会这样做:

AtletiekLid lid;

strcpy(&lid.naam, "Test");
strcpy(&lid.leeftijd, "18");
addLid(ledenArray, lid, nLeden); //Program stopped working (windows error) on this line.

addLid 函数:

void addLid(AtletiekLid **ledenArray, AtletiekLid lid, int *nLeden) {   
    *ledenArray = (AtletiekLid *)realloc(*ledenArray, (*nLeden + 1) * sizeof(AtletiekLid));
    (*ledenArray)[*nLeden] = lid;
    (*nLeden)++;
}

addLid(我的程序崩溃的地方)它在这一行崩溃了:

*ledenArray = (AtletiekLid *)realloc...

谁能帮帮我,我不知道我做错了什么。

【问题讨论】:

  • strcpy(&lid.leeftijd, "18"); -> lid.leeftijd = 18。不要忽略编译器警告。
  • 永远不要使用与左侧赋值相同的指针变量给realloc 调用。
  • @MichaelWalz 这并不能解决问题。
  • @NoëlVissers 还有其他问题,例如addLid(ledenArray, lid, &nLeden); -> addLid(&ledenArray, lid, &nLeden);
  • 另外:不要强制转换 calloc 和 realloc 的返回值。

标签: c arrays struct realloc


【解决方案1】:

贴出的代码片段有3个错误:

  • strcpy(&lid.naam, "Test"); 应该读作strcpy(lid.naam, "Test");,因为lid.naam 是一个数组,它在传递给函数时衰减为指向其第一个元素的指针。

  • strcpy(&lid.leeftijd, "18"); 不正确。 lid.leeftijdunsigned int,你应该改写lid.leeftijd = 18;

  • addLid(ledenArray, lid, nLeden); 也不正确,因为addLid 期望指向指针的指针作为其第一个参数,并将指向元素数量的指针作为第三个参数,因此它可以在调用者的范围内更新这些。您应该改为:addLid(&ledenArray, lid, &nLeden);

请注意,您应该在编译程序时启用更多警告,以便让编译器针对此类类型不匹配发出有用的诊断信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多