错误地初始化多维数组和内存
Incorrectly initializing a multi-dimensional array and Memory
在为 AVR 微控制器编写一些代码时,我的代码可以编译但会在 运行 时间崩溃(当我 运行 微控制器上的代码时,微控制器会停止运行)在进行一些故障排除后,我意识到我错误地初始化了一个多维数组。
我的问题是关于数组的内存是如何分配的,是否有可能因为该内存位置应该有数据而没有,这会导致崩溃吗?
假设我有一个二维数组。通常情况下,如果正确初始化可能看起来像这样:
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" }
};
所以我分配了很多内存但是没有使用。在 运行 时,是否有可能为我的数组分配的未使用内存部分被程序的另一部分使用,从而导致崩溃?
当您初始化数组时使用:
char *monthsDays[12][2] = {
{"Jan", "31" },
{"Feb", "28" }
};
monthsDays[2][0]
到 monthsDays[11][1]
被初始化为 0
。取消引用它们将导致 UB。问题是由取消引用这些 NULL 指针还是由其他代码踩到这些内存引起的,只有您可以通过查看其余代码来判断。
在为 AVR 微控制器编写一些代码时,我的代码可以编译但会在 运行 时间崩溃(当我 运行 微控制器上的代码时,微控制器会停止运行)在进行一些故障排除后,我意识到我错误地初始化了一个多维数组。
我的问题是关于数组的内存是如何分配的,是否有可能因为该内存位置应该有数据而没有,这会导致崩溃吗?
假设我有一个二维数组。通常情况下,如果正确初始化可能看起来像这样:
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" }
};
所以我分配了很多内存但是没有使用。在 运行 时,是否有可能为我的数组分配的未使用内存部分被程序的另一部分使用,从而导致崩溃?
当您初始化数组时使用:
char *monthsDays[12][2] = {
{"Jan", "31" },
{"Feb", "28" }
};
monthsDays[2][0]
到 monthsDays[11][1]
被初始化为 0
。取消引用它们将导致 UB。问题是由取消引用这些 NULL 指针还是由其他代码踩到这些内存引起的,只有您可以通过查看其余代码来判断。