【问题标题】:Compact pointers to retrieve array element [duplicate]用于检索数组元素的紧凑指针[重复]
【发布时间】:2021-11-12 14:37:09
【问题描述】:

我想使用紧凑符号访问二维数组。

如果数组被定义为如下的指针数组,那么如何解析数组元素呢?

int main(void)
{
    char *a[2] = {
    "databytes",
    "dataword"
    };
    
    char **q = a;

    return 0;
}

以下方法效果很好。

int main(void)
{
    char a[2][10] = {
    "databytes",
    "dataword"
    };
    //char **p = a;
    char *q = &a[0][0];

    for(int i = 0; i < 2; i++)
        for(int j = 0; j < 10; j++)
            printf("%c\n", *q++);
    return 0;
}

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 您可能没有将'\0' 值元素(所有未显式初始化的元素)视为终端中的字符。在我的情况下,我得到一个空行,但它们不是实际数据的一部分
  • 您可以将一个连续的内存区域视为一个由可变数量的指向可变大小字符串的指针组成的数组(通常的约定是在最后一个字符串之后使用两个NUL 字节)。在这种情况下,您分配给每个字符串的空间是已知的。但是,当您到达 q 时,这些知识已经丢失。另见c-faq.com/aryptr/pass2dary.html
  • 什么是“紧凑符号”? then how I can parse through array elements? 通常,就像二维数组一样,for(int i = 0; i &lt; 2; i++) for(int j = 0; j &lt; 5; j++) print("%c", a[i][j]);
  • “以下方法效果很好”。这是未定义的行为,正如标准附录 J2 中明确指出的那样:“数组下标超出范围,即使对象显然可以使用给定的下标访问(如在左值表达式 a[1][7] 中给出声明 int a[4][5] )"。

标签: c


【解决方案1】:

以下代码应该有助于为您说明a 的布局。 a 对应于 2 × 10 = 20 字节的存储读取。如果a[0] 指向一个由9 个字符组成的字符串,那么这些字符和NUL 会占用为该字符串留出的空间。另一方面,如果a[1] 指向一个由5 个字符组成的字符串,则它总共占用6 个字节的存储空间,并且a[1][6]a[1][9] 处的值未初始化。因此,一旦到达一个字符串的末尾,就需要跳到下一个字符串的开头。

#include <stdio.h>

int
main(void)
{
    char a[][10] = {
        "databytes",
        "hello",
        "dataword",
    };

    char* q = &a[0][0];

    for (int i = 0; i < sizeof(a) / sizeof(a[0]); ++i) {
        for (int j = 0, offset = i * sizeof(a[0]);
             *(q + offset) && (j < sizeof(a[0]));
             ++j, ++offset) {
            printf("%c --- (%d)\n", *(q + offset), j);
        }
    }

    return 0;
}

输出:

d --- (0)
a --- (1)
t --- (2)
a --- (3)
b --- (4)
y --- (5)
t --- (6)
e --- (7)
s --- (8)
h --- (0)
e --- (1)
l --- (2)
l --- (3)
o --- (4)
d --- (0)
a --- (1)
t --- (2)
a --- (3)
w --- (4)
o --- (5)
r --- (6)
d --- (7)

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 2010-12-09
    相关资源
    最近更新 更多