VS中的malloc异常

时间:2011-03-30 17:50:39

标签: c++ c

我正在尝试使用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时,我无法理解为什么!

3 个答案:

答案 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,因此您将resultchar **更改为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的类型,因此当您更改该类型时,另一个尺寸会自动调整以匹配。