如何在 C++ 中确定 2D 无符号短指针数组长度
Posted
技术标签:
【中文标题】如何在 C++ 中确定 2D 无符号短指针数组长度【英文标题】:How to determine 2D unsigned short pointers array length in c++ 【发布时间】:2010-04-28 10:48:04 【问题描述】:我发现很难确定二维无符号短指针数组中列的长度。据我所知,我已经正确完成了内存分配。并且可以正确打印。
请看以下代码段:
int number_of_array_index_required_for_pointer_abc=3;
char A[3][16];
strcpy(A[0],"Hello");
strcpy(A[1],"World");
strcpy(A[2],"Tumanicko");
cout<<number_of_array_index_required_for_pointer_abc*sizeof(unsigned short)<<endl;
unsigned short ** pqr=(unsigned short **)malloc(number_of_array_index_required_for_pointer_abc*sizeof(unsigned short));
for(int i=0;i<number_of_array_index_required_for_pointer_abc;i++)
int ajira = strlen(A[i])*sizeof(unsigned short);
cout<<i<<" = "<<ajira<<endl;
pqr[i]=(unsigned short *)malloc(ajira);
cout<<"alocated pqr[i]= "<<sizeof pqr<<endl;
int j=0;
for(j=0;j<strlen(A[i]);j++)
pqr[i][j]=(unsigned short)A[i][j];
pqr[i][j]='\0';
for(int i=0;i<number_of_array_index_required_for_pointer_abc;i++)
//ln= (sizeof pqr[i])/(sizeof pqr[0]);
//cout<<"Size of pqr["<<i<<"]= "<<ln<<endl;
// I want to know the size of the columns i.e. pqr[i]'s length instead of finding '\0'
for(int k=0;(char)pqr[i][k]!='\0';k++)
cout<<(char)pqr[i][k];
cout<<endl;
【问题讨论】:
为什么在 C++ 中使用 malloc?为什么不使用标准容器,例如 std::vector? 对于 C++ 代码,这是相当可怕的。您可能应该删除 C 或 C++ 标记。 【参考方案1】:你快到了。你有这个循环:
for(int k=0;(char)pqr[i][k]!='\0';k++) ...
此循环完成后,k
将具有行的长度。所以这会给你pqr[i]
的长度(不包括空终止符):
int k;
for (k=0; pqr[i][k] != 0; k++)
;
cout<<"The length is "<< k <<endl;
编辑:
您现在补充说,即使空终止符不存在,您也想知道大小。没有办法做到这一点。您将需要某种终结器,或者将大小存储在某处。如果您使用vector<unsigned short>
,它将为您存储大小。由于它还处理分配和释放,因此是推荐的选择。
编辑>
请注意,您的分配中有两个错误:
pqr
是一个指针数组,但您分配的大小为 C*sizeof(unsigned short)
。那应该是C*sizeof(unsigned short *)
。
您没有为每个字符串末尾的空终止符分配内存:您应该为每个字符串分配 (strlen(A[i])+1) * sizeof(unsigned short)
。
【讨论】:
天啊,我没能让你明白,我想知道 pqr[i] 的长度。如您所见,我也可以知道 strlen(A[i]) 的长度......或者我在末尾附加了一个 '\0' ,因此确定 k 的长度非常容易。问题是,当我有动态数据而不是静态字符数组 A[3][16] 时,我需要通过某种 sizeof 技巧来检测列大小,即 pqr[i]。我现在明白了吗,伙计? 没有诀窍:您必须自己存储每个已分配缓冲区的长度。执行此操作的最简单方法(因为您将其标记为 C++)是使用 C++ 的std::vector
并让它为您分配。【参考方案2】:
你在这一行有一个错误:
pqr[i][j]='\0';
此时j
等于strlen(A[i])
- 这超出了您为 pqr 设置的范围:
int ajira = strlen(A[i])*sizeof(unsigned short);
pqr[i]=(unsigned short *)malloc(ajira);
pqr[i]
从[0]
变为[strlen(A[i])-1]
,因此写入pqr[i][strlen(A[i])]
会溢出数组。当您自己分配内存时,编译器不会注意到这一点。
该错误的解决方案是 malloc(ajira+sizeof(unsigned short))
在 cmets 之后编辑
【讨论】:
malloc(ajira+1)
是不够的:您需要为 unsigned short 添加内存并且添加一个字节。此外,\0
将覆盖下一个unsigned short[]
是不正确的,因为每个数组都是单独分配的。但它会调用未定义的行为。
顺便说一句,当前代码运行正常。你说的是对的,但是这一行 pqr[i][j]='\0' 是在我没有得到 pqr[i] 的长度时写的,所以我需要一个 '\0' 标志来确定大小.因此,根据您建议的更改,我也没有得到 pqr[i] 的大小。
那你会得到什么呢?它会崩溃吗?不编译?返回 0?返回随机金额?返回比预期长度多 1 个?以上是关于如何在 C++ 中确定 2D 无符号短指针数组长度的主要内容,如果未能解决你的问题,请参考以下文章