【问题标题】:Incorrectly initializing a multi-dimensional array and Memory错误地初始化多维数组和内存
【发布时间】:2015-02-04 17:02:38
【问题描述】:

在为 AVR 微控制器编写一些代码时,我的代码会编译但会在运行时崩溃(当我在微控制器上运行代码时,微控制器会停止运行)在进行了一些故障排除后,我意识到我错误地初始化了一个多维数组。 我的问题是关于如何分配数组的内存,是否有可能因为该内存位置应该有数据而没有,这会导致崩溃吗?
假设我有一个二维数组。通常,如果正确初始化 if 可能看起来像这样:

char *monthsDays[12][2] = {
    {"Jan", "31" }, 
    {"Feb", "28" }, 
    {"Mar", "31" }, 
    {"Apr", "30" }, 
    {"May", "31" }, 
    {"Jun", "30" }, 
    {"Jul", "31" }, 
    {"Aug", "31" }, 
    {"Sep", "30" }, 
    {"Oct", "31" }, 
    {"Nov", "30" }, 
    {"Dec", "31" }
};

说我是这样创建的:

char *monthsDays[12][2] = {
        {"Jan", "31" }, 
        {"Feb", "28" } 

};

所以我分配了很多内存但没有使用它。在运行时,是否有可能为我的数组分配的未使用部分内存被程序的另一部分使用,从而导致崩溃?

【问题讨论】:

  • 没有。您的代码中并非没有我们看不到的其他错误
  • 数组的其余部分是零初始化的。所以应该没有问题,除非在您的特定情况下您访问该区域需要一个空终止字符串。
  • 好的,我需要做更多的故障排除。它很难在微控制器环境之外重新创建。
  • @bolov 它是一个指针数组(指向声明的字符串文字),未定义的指针包含 NULL不是零终止符
  • @WeatherVane 这是我的观点

标签: c memory multidimensional-array


【解决方案1】:

当您使用以下方法初始化数组时:

char *monthsDays[12][2] = {
        {"Jan", "31" }, 
        {"Feb", "28" } 

};

monthsDays[2][0]monthsDays[11][1] 被初始化为 0。取消引用它们会导致 UB。问题是由取消引用这些 NULL 指针还是由其他代码踩到这些内存引起的,只有您可以通过查看其余代码来判断。

【讨论】:

    猜你喜欢
    • 2018-10-07
    • 2014-06-23
    • 2015-08-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    相关资源
    最近更新 更多