我正在尝试使用以下代码分配要访问的{2}字符数组:
ary[i][j]
不幸的是,这会导致某处出现溢出,并且程序执行中存在错误,我从这里获得了一些动态分配的引用:http://staff.science.nus.edu.sg/~phywjs/CZ1102/lecture20/sld014.htm。
我想知道这里有什么问题以及如何解决这个问题,谢谢。
答案 0 :(得分:7)
您的运算符优先级错误:*vals[i]
评估为*(vals[i])
,而不是(*vals)[i]
。有关详细信息,请参阅http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence。
修复方法是将*vals[i]
更改为(*vals)[i]
。
此外,分配*vals[i] = (char*) calloc( sizeof( char* ), stringmaxlen );
是错误的。它分配的内存太多,因为它为stringmaxlen
指针分配了空间,但是你只需要stringmaxlen
个字符。
答案 1 :(得分:3)
我想将以下内容添加到cmaster的答案中。
而不是
*vals = (char**) calloc( sizeof( char** ), valscount );
使用
*vals = (char**) calloc( sizeof( char* ), valscount );
而不是
(*vals)[i] = (char*) calloc( sizeof(char*), stringmaxlen );
使用
(*vals)[i] = (char*) calloc( sizeof(char), stringmaxlen );
在第一种情况下,分配的内存大小不会发生变化,因为sizeof(char**)
与sizeof(char*)
相同。然而,第二种情况并非如此。 sizeof(char)
为1而sizeof(char*)
更大 - 32位硬件为4,64位硬件为8。
更重要的是,它澄清了意图 - 你想为stringmaxlen
字符分配内存,而不是stringmaxlen
指向字符的指针。