我正在尝试使用c为2维数组分配内存,我在visual studio 2008中遇到异常。
int Count=16383,N=14;
char **result=(char**)malloc(sizeof(char)*Count);
for(int i=1;i<=Count;i++)
result[i] = (char*)malloc(sizeof(char)*N);
Unhandled exception at 0x012e1692 in combination.exe: 0xC0000005:
Access violation writing location 0x00590000
异常发生在我11272时,我无法理解为什么!
答案 0 :(得分:8)
char **result=(char**)malloc(sizeof(char)*Count);
应该是
char **result=(char**)malloc(sizeof(char*)*Count);
答案 1 :(得分:1)
这就是为什么在C代码中你永远不应该转换malloc
的结果以及为什么你不应该在sizeof
中使用类型名称。您的内存分配应该如下所示
char **result = malloc(Count * sizeof *result);
for(int i = 0; i < Count; ++i)
result[i] = malloc(N * sizeof *result[i]);
这样可以自动正确计算大小,并且您的内存分配将与类型无关。
P.S。你说你正在使用C.为什么你的问题同时被标记为[C]和[C ++]?
答案 2 :(得分:0)
首先,不要转换malloc的结果。如果您忘记包含提供malloc
的正确原型(或至少声明)的标题,那么完全没有必要,模糊您的代码,并且可以掩盖潜在的严重错误。
其次,请勿乘以sizeof(char)
或sizeof(whatever_type)
- 而是乘以sizeof(*destination_variable)
。最后,不要在循环中使用<=
,而是使用<
。在C中遍历数组的常规习惯用法是for (i=0; i<array_size; i++)
:
int Count=16383,N=14;
char **result = malloc(Count * sizeof(*result));
for(int i=1;i<Count;i++)
result[i] = malloc(N * sizeof(*result[i]));
这不仅可以解决您遇到的问题,还可以防止将来再次发生问题。例如,让我们考虑从这样的代码开始:
char **result = malloc(Count * sizeof(char *));
for(int i=1;i<Count;i++)
result[i] = malloc(N * sizeof(char));
现在,您被告知需要支持Unicode,因此您将result
从char **
更改为wchar_t **
:
wchar_t **result = malloc(Count * sizeof(char *);
for(int i=1;i<Count;i++)
result[i] = malloc(N * sizeof(char));
但现在又出现了问题 - 您需要将sizeof(char)
更改为sizeof(wchar_t)
。你真的 也应该将sizeof(char *)
改为sizeof(whcar_t *)
,虽然两者相同的可能性很大,所以你将能够摆脱这种差异
如果您使用sizeof(*result)
和sizeof(*result[i])
,则会自动处理此类更改 - 其他所有内容都基于result
的类型,因此当您更改该类型时,另一个尺寸会自动调整以匹配。