Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中的数组中迭代_C_Arrays - Fatal编程技术网

在C中的数组中迭代

在C中的数组中迭代,c,arrays,C,Arrays,嘿,我有这种类型的东西 eph_t *a; 正如您所看到的,该类型为eph\t。它是C语言中的一个数组,但我不知道数组的大小,也不知道数组的结束元素是什么。 有没有办法,我可以遍历整个数组,因为我想将数组中每个元素的值赋给某个对象 什么是我可以考虑的选择? 如果您无法理解问题中的某些内容,请发表评论,以便我可以通知您。如果您不知道数组的大小,则迭代该数组是不安全的。任何时候,当您试图读取超过最后一个元素的元素时,您将获得未定义的行为。除非您知道数组的大小,否则没有什么安全的方法可以做。如果您不

嘿,我有这种类型的东西

eph_t *a;
正如您所看到的,该类型为eph\t。它是C语言中的一个数组,但我不知道数组的大小,也不知道数组的结束元素是什么。 有没有办法,我可以遍历整个数组,因为我想将数组中每个元素的值赋给某个对象

什么是我可以考虑的选择?
如果您无法理解问题中的某些内容,请发表评论,以便我可以通知您。

如果您不知道数组的大小,则迭代该数组是不安全的。任何时候,当您试图读取超过最后一个元素的元素时,您将获得未定义的行为。除非您知道数组的大小,否则没有什么安全的方法可以做。

如果您不知道数组的大小,那么对其进行迭代是不安全的。任何时候,当您试图读取超过最后一个元素的元素时,您将获得未定义的行为。除非知道数组的大小,否则没有什么安全的方法可以做。

C中的指针只是一个地址。当用作数组时,必须通过其他方法计算数组的长度

许多处理数组的库都有接受数组指针及其大小的函数。例如,希望第二个nmemb参数给出要排序的qsort的数组基第一个参数的元素数

或者,您可以在C99中使用pass和return,而不是只传递一个指针,当指针指向类似

  struct eph_tuple_st {
     unsigned len;
     eph_t* ptrtab[];
  };
按照灵活阵列ptrtab字段具有len元素的约定

最后,正如其他人所建议的,您可以使用一个sentinel值,即一个空字来结束数组。一般来说,我不建议有缓冲区溢出的风险,计算实际大小的时间复杂性

FWW,最近的C++有C++ 2014,OCAM具有模块。您可以切换到更友好的编程语言。

C中的指针只是一个地址。当用作数组时,必须通过其他方法计算数组的长度

许多处理数组的库都有接受数组指针及其大小的函数。例如,希望第二个nmemb参数给出要排序的qsort的数组基第一个参数的元素数

或者,您可以在C99中使用pass和return,而不是只传递一个指针,当指针指向类似

  struct eph_tuple_st {
     unsigned len;
     eph_t* ptrtab[];
  };
按照灵活阵列ptrtab字段具有len元素的约定

最后,正如其他人所建议的,您可以使用一个sentinel值,即一个空字来结束数组。一般来说,我不建议有缓冲区溢出的风险,计算实际大小的时间复杂性


FWW,最近的C++有C++ 2014,OCAM具有模块。您可以切换到更友好的编程语言。

正如其他人所说,在不知道数组结尾的情况下迭代数组是不安全的。这通常通过以下方式解决

如果您有权访问数组声明int a[10];例如您可以使用sizeof操作符来确定数组的大小。请注意,将指向数组的指针传递给函数时,这将不起作用。 使用数组的函数通常会采用直接大小,或者以某种方式推断大小作为函数的额外参数,memset就是一个很好的例子 数组可能有一个特殊的终止符元素,通常在结尾处有一个NULL或0元素,这意味着您不能在C字符串之外进行迭代,这是一个很好的例子
因此,如果您正在设计一个以数组作为参数的函数,请使用上述模式。如果您使用的函数不使用上述模式之一,请将问题作为错误报告给库设计器

正如其他人所说,在不知道数组末尾的情况下迭代数组是不安全的。这通常通过以下方式解决

如果您有权访问数组声明int a[10];例如您可以使用sizeof操作符来确定数组的大小。请注意,将指向数组的指针传递给函数时,这将不起作用。 使用数组的函数通常会采用直接大小,或者以某种方式推断大小作为函数的额外参数,memset就是一个很好的例子 数组可能有一个特殊的终止符元素,通常在结尾处有一个NULL或0元素,这意味着您不能在C字符串之外进行迭代,这是一个很好的例子
因此,如果您正在设计一个以数组作为参数的函数,请使用上述模式。如果您使用的函数不使用上述模式之一,请将问题作为错误报告给库设计器

您可以保留数组的第一个元素来存储大小

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int x, y;
    double z;
} eph_t;

static void temp(eph_t *a)
{
    size_t n;

    memcpy(&n, a - 1, sizeof(size_t)); /* get size (stored in a - 1) */
    printf("Count = %zu\n", n);
}

int main(void)
{
    const size_t n = 5;
    eph_t a[n + 1]; /* allocate space for 1 more element */

    memcpy(&a[0], &n, sizeof(size_t)); /* now the first element contains n */
    temp(a + 1); /* skip first element */
    return 0;
}

您可以保留数组的第一个元素来存储大小

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int x, y;
    double z;
} eph_t;

static void temp(eph_t *a)
{
    size_t n;

    memcpy(&n, a - 1, sizeof(size_t)); /* get size (stored in a - 1) */
    printf("Count = %zu\n", n);
}

int main(void)
{
    const size_t n = 5;
    eph_t a[n + 1]; /* allocate space for 1 more element */

    memcpy(&a[0], &n, sizeof(size_t)); /* now the first element contains n */
    temp(a + 1); /* skip first element */
    return 0;
}

你能告诉我关于决定数组大小的预定义函数吗pointers@Billa没有。这是C和所有标准中的一个重要限制

处理数组的库函数要求您提供数组的大小。在标准C中不存在这样的函数。一些MALLC实现可能有一个非标准的例程,它给出了一个MalLoC指针的大小。如果长度和指针也发生了变化,您可能需要考虑使用类而不是结构。这可能会导致不明显的行为。是的,我误解了这个问题,尽管小心使用结构始终是一个好主意。您能告诉我关于通过声明的数组大小的预定义函数吗pointers@Billa没有。这是C语言中的一个重要限制,所有处理数组的标准库函数都要求您提供数组的大小。在标准C中不存在这样的函数。一些MALLC实现可能有一个非标准的例程,它给出了一个MalLoC指针的大小。如果长度和指针也发生了变化,您可能需要考虑使用类而不是结构。这可能会导致不明显的行为。是的,我误解了这个问题,尽管小心使用结构始终是个好主意。也可以使用sentinel值,但这也很难正确处理。@Chryl如果你知道该sentinel的值,那就不太难了。如果你没有,你就迷路了。@glglglgl但是你必须记住,确保它已经就位。考虑到C字符串溢出错误的数量,这显然比看起来要困难得多。@chrylis这也是正确的。。。人们总是认为这不可能如此困难,但显然是……也可以使用哨兵值,但这也很难正确处理。@chryl如果你知道哨兵的值,那就不难了。如果你没有,你就迷路了。@glglglgl但是你必须记住,确保它已经就位。考虑到C字符串溢出错误的数量,这显然比看起来要困难得多。@chrylis这也是正确的。。。人们总是认为它不可能如此困难,但显然它是…a不是数组,它是指向eph_t的指针。没有更多可用的内存块大小信息,也没有更少您可以使用指针指向数组或该类型的单个项,并对任何指针使用数组索引。没有更多可用内存块大小信息,也没有更少您可以使用指针指向数组或该类型的单个项,并对任何指针使用数组索引。IMO有趣的相关内容: