Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VS中的malloc异常_C++_C - Fatal编程技术网

C++ VS中的malloc异常

C++ VS中的malloc异常,c++,c,C++,C,我试图使用c为二维数组分配内存,但在VisualStudio2008中遇到了一个异常 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.

我试图使用c为二维数组分配内存,但在VisualStudio2008中遇到了一个异常

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
int Count=16383,N=14;
字符**结果=(字符**)malloc(大小(字符)*计数);
对于(int i=1;i
应该是

char **result=(char**)malloc(sizeof(char*)*Count);
应该是

char **result=(char**)malloc(sizeof(char*)*Count);

这就是为什么在C代码中永远不应该强制转换
malloc
的结果,也不应该在
sizeof
中使用类型名的原因

char **result = malloc(Count * sizeof *result);

for(int i = 0; i < Count; ++i)       
    result[i] = malloc(N * sizeof *result[i]);  
char**result=malloc(Count*sizeof*result);
对于(int i=0;i
这样,大小将自动正确计算,并且内存分配将与类型无关


另外,您说您正在使用C。为什么您的问题同时被标记为[C]和[C++]?

这就是为什么在C代码中您不应该强制转换
malloc
的结果,也不应该在
sizeof
中使用类型名称。您的内存分配应该如下所示

char **result = malloc(Count * sizeof *result);

for(int i = 0; i < Count; ++i)       
    result[i] = malloc(N * sizeof *result[i]);  
char**result=malloc(Count*sizeof*result);
对于(int i=0;i
这样,大小将自动正确计算,并且内存分配将与类型无关


另外,你说你正在使用C。为什么你的问题同时被标记为[C]和[C++]?

首先,不要强制转换malloc的结果。这完全是不必要的,会混淆你的代码,如果你忘记包含一个提供适当原型(或至少声明)的头,可能会掩盖一个潜在的严重错误属于
malloc


其次,不要乘以
sizeof(char)
,或
sizeof(无论什么类型)
——而是乘以
sizeof(*destination\u变量)
。最后,首先不要使用
,而是不要强制转换malloc的结果。这完全是不必要的,会混淆代码,如果您忘记包含一个标题,该标题提供
malloc
的正确原型(或至少声明),则可能会掩盖潜在的严重错误



第二,不要乘以
sizeof(char)
,或
sizeof(无论什么类型)
——而是乘以
sizeof(*destination\u变量)
。最后,不要使用
,我相当确定您的for循环应该是
for(int i=0;iyeah你是对的..但我不在乎,因为我只是在检查是否发生异常。thx无论如何…如果你从该循环中得到另一个错误,我不会感到惊讶,你将溢出并可能写入内存,被其他东西占用,潜在的重要东西我相当确定你的for循环应该是
for(It i=0;我是不正确的……但我并不关心,因为我只是检查Y异常。THX无论如何……我不会感到惊讶,如果你从那个循环中得到另一个错误,你会溢出,并可能写入其他事物占用的内存,潜在重要的事情,数组是代码0>代码)。C++和C++中,<代码>或者
循环是错误的。aaah,这就是为什么我将(sizeof(char)*Count);替换为(sizeof(int)*Count);它工作了!因为sizeof(char*)=sizeof(int)=4@Mat你说的以0为基础是什么意思?这意味着数组的起始位置是索引0,而不是1。第0项是第一个位置。因此,如果有10项,你将从0-9迭代。第一个元素是
result[0]
,而不是
result[1]
。你的
for
循环应该从0计数到(Count-1)此外,数组是“代码>0”/代码>,基于C和C++,<<代码> < /COD>循环是错误的。AAAAH,这就是为什么当我替换(siZoof(char)*CUTE)时,用(sieOf(int)*计数);它工作!自从sieOf(char *)= sieZof(int)=4@Mat你说的以0为基础是什么意思?这意味着数组的起始位置是索引0,而不是1。第0项是第一个位置。因此,如果有10项,你将从0-9迭代。第一个元素是
result[0]
,而不是
result[1]
。你的
for
循环应该从0计数到(Count-1)。有趣的是,我以前没见过(我用C已经很久了)。我想你每天都会学到一些新东西。有趣的是,我以前没见过(我用C已经很久了)。我想你每天都会学到一些新东西。你必须从malloc()中得出结果如果你用C/C++编程,就像@lina所做的那样。如果你决定用C,那就不同了…@Bo Persson:IMO,这属于“只说不”类别。尽管它们有着共同的历史,但大多数代码(包括这个)试图两者兼容实际上对任何一方都不好。@Bo,作为一个简单的规则,没有C/C++这样的东西。这一点特别重要,因为它们的动态分配概念有根本的不同:使用
new/new[]/delete/delete[]< C/>代码> C++>代码> MalC/C++/Cube > C.@ JNES,但问题仍然是C和C++的标记,那么我们如何知道答案呢?也许“不要抛出Maloc的结果”意味着我们在使用CAST时不应该使用它吗?@博城,它应该是“不要尝试在C和C++中使用动态分配的相同代码”。。然后在C++中“不要使用
malloc
”和“不要转换其结果”。如果你用C/C++编程,你确实必须从malloc()中转换结果,就像@lina所做的那样。如果你决定使用C,那就不同了…@Bo Persson:IMO,这属于“只说不”类别。尽管它们有共同的历史,但大多数代码(包括这个)试图两者兼容实际上对任何一方都不好。@Bo,作为一个简单的规则,没有C/C++这样的东西。这一点特别重要,因为它们的动态分配概念有根本的不同:使用
new/new[]/delete/delete[]对于C/C++,代码< > C++ > MalOc/Field/Fux>,但问题仍然是C和C++的标记,那么我们怎么知道答案呢?也许“不投Maloc的结果”意味着我们不应该在使用WOLL时使用它。
char **result = malloc(Count * sizeof(char *));

for(int i=1;i<Count;i++)
    result[i] = malloc(N * sizeof(char));
wchar_t **result = malloc(Count * sizeof(char *);

for(int i=1;i<Count;i++)
    result[i] = malloc(N * sizeof(char));