【问题标题】:How to differentiate empty and 0 in an int array in C?如何区分C中int数组中的空和0?
【发布时间】:2015-08-30 03:39:41
【问题描述】:

我是 C 的初学者,现在我正在学习指针和动态内存分配。我想编写一个简单的程序来创建空数组并检查给定数字的存在。这是我的代码:

/* create an empty array pointer */
int* createArray(){
    int *a = (int*) malloc(sizeof(int));
    return a;
}

void findArrayElement(int *list, int element){

    int i;
    int len = (sizeof(list) / sizeof(int));
    if (sizeof(list) == 0) {
        printf("NO\n");
        return;
    }
    for (i=0; i<len; i++) {
        if (list[i] == element) {
            printf("YES\n");
            return;
        }
    }

    printf("NO\n");
}

int main(int argc, const char * argv[]) {

    int *p;
    p = createArray();

    printf("size of int is: %lu\n", sizeof(int));
    printf("size of p is: %lu\n", sizeof(p));
    printf("LENGTH of p is: %lu\n", ARRLENGTH(p));

    findArrayElement(p, 2);
    findArrayElement(p, 0);

    return 0;
}

但是当我运行程序时,我总是在寻找 0 时得到 'YES',所以

  1. 有没有办法区分整数 0 和完整的空数组?
  2. 另外我不确定我的函数createArray() 是否是创建空数组的正确方法。

谢谢大家。

【问题讨论】:

  • 旁注:您正在创建一个包含单个条目的数组。

标签: c arrays pointers


【解决方案1】:

有没有办法区分整数0和完整的空数组?

如何定义一个空数组?一旦你分配了一个内存块并将它分配给一个指针,它就已经有了一些值(在alloc 的情况下是未定义的)。将指针标记为未使用或未分配 os 的最常用方法来为其分配 NULL。

我也不确定我的函数 createArray() 是否是创建空数组的正确方法。

sizeof 返回给定对象(或类型)在内存中占用的字节数。在您的情况下,sizeof(list) 返回 8 因为它是一个指针。 为了分配一个数组,函数必须接收它的大小。目前它总是只为一个整数分配大小。

编辑:添加示例。

/* create an empty array pointer */
int* createArray(size_t size)
{
    return (size ? (int*) malloc(sizeof(int)*size) : NULL);
}

所以现在返回的指针应该与数组的大小“耦合”。这意味着接收数组作为参数的每个函数也应该接收它的大小。

【讨论】:

  • 这段代码不必要地复杂,并且有多余的演员表。 return malloc(sizeof(int) * size); 更简单。 malloc 在分配零字节的情况下定义良好。
  • 我之前确实尝试过,但我不确定 malloc 的大小为 0。这是否意味着当我将 0 传递给函数时,我可以获得指向空数组的指针?
  • @MattMcNabb malloc 返回 void* 我喜欢使代码清晰一致,而且 malloc 的 0 定义不明确,不一定返回 NULL。 stackoverflow.com/questions/1073157/zero-size-malloc.
  • @SensEyeNULL 根据我的示例,如果您将 0 作为数组大小传递,您将获得 NULL。这意味着没有分配任何内容。
  • 对不起,我的意思是“非未定义”:您可能会得到空指针或非空指针,但无论发生哪种情况,它都很好,并且不会破坏程序的其余部分。是的 malloc 返回void *,不知道你的意思是什么。那你为什么不写(int *)NULL
【解决方案2】:

sizeof返回数组指针的内存大小,与内容无关。

编辑:如果它存在于内存中,它将是非零的。

edit 3:删除了不准确的信息,见cmets关于创建一个变量来记录长度。同样来自 cmets,请注意您的 createArray 函数正在为正好 1 个整数创建一个数组。在 C 中,数组是固定长度的。所以这个 Array 的大小总是相同的(无论你是否在其中存储了一些东西)。 sizeof(pointer) 将始终返回为指针分配的内存,而不是为其指向的数组分配的内存。

【讨论】:

  • 您认为sizeof(list)sizeof(p) 在发布的代码中返回数组的大小吗?如何通过检查所有索引来确定数组是否为“空”?
  • 即使我通过int *p 声明一个空指针,sizeof(p) 也会给我 8,所以我认为sizeof 不是这样做的正确方法,但我想不出另一种解决方案。
  • @jwkicklighter:用 NULL 测试相等性(假设这就是 null 的意思)只会告诉你 int 是否等于 0。对于int,这是一个完全有效的值。你知道C吗?
  • @immibis 所以我想我应该用数组和另一个整数创建一个结构来记录长度
  • @SensEyeNULL:数组长度数组怎么样?但说真的,这是一个设计问题,你正在考虑它是件好事。将数组指针与其长度保持在一起的struct 是一种解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 2010-10-02
相关资源
最近更新 更多