我有一个二维数组表示为双指针 - `
char ** arr;
arr = (char **) malloc(100 * sizeof(char *));
for (i=0; i<100; i++)
arr[i] = (char *) malloc(3 * sizeof(char));
现在我在arr中有100行和3列。但是这个数组在其他地方用于填充远远少于100的行。那么如何才能获得大小(已填充的行数)以便打印此数组? ?
答案 0 :(得分:2)
你不能,你将不得不使用一个更具表现力的表达来保存这样的元信息。
记忆是记忆,没有办法确定它是否已被“使用”,因为一旦你分配它就会一直存在。
如果你不能使用sentinel方法(比如C字符串,让终结符指示有效数据结束),你将不得不使用显式长度值或其他表达此方法的方法。
另外,please don't cast the return value of malloc()
in C。
此外,不要按sizeof (char)
扩展分配,因为总是1,你只是添加噪音。我的意见非常明显。如果代码包含乘法,那么你的代码在技术上永远不会出错,而且有些人明显感觉它会增加价值并使代码更清晰。
最后,您正在进行100次堆积分配,每次分配3个字节,效率非常低。我建议只做一个包含100个3字节数组的数组(可能表示为struct
s的数组。)
答案 1 :(得分:0)
我有一个2d数组表示为双指针
不,不。你有一个基于指针的指针查找表。要动态分配多维数组,请执行something like this。另请参阅How do I correctly set up, access, and free a multidimensional array in C?。
但是这个数组在其他地方使用,其填充的行数远远少于100.所以如何获得大小(填充的行数)才能打印这个数组?
让您的应用程序跟踪它。没有其他办法。即使您使用正确的数组而不是查找表,sizeof
等也无法正常工作。因为sizeof
对数组的内容一无所知。最好和最简单的解决方案是保持一个单独的大小计数器变量。
如果由于某种原因你不能使用这样的尺寸计数器,你可能会做出更复杂的事情。使用一些包装器API来填充值的代码。然后假设您分配了101个项目而不是100个项目,并使用第一个或最后一个项目来包含大小。如果使用这样的方法,则必须清除所有内存单元格,因此在这种情况下最好使用calloc而不是malloc。
如果您需要在中间添加/删除项目,可以制作链表实现。