如何在 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&lt;unsigned short&gt;,它将为您存储大小。由于它还处理分配和释放,因此是推荐的选择。

编辑>


请注意,您的分配中有两个错误:

    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 无符号短指针数组长度的主要内容,如果未能解决你的问题,请参考以下文章

带有空指针的 2D 指针数组 c++

来自无符号短数组的 OpenCV Mat

C程序:用函数更新无符号字符指针数组

将“无符号字符”数组转换为“无符号短”数组的有效方法是啥?

在C中将无符号短数组转换为字节数组

获取无符号字符的长度*