我是C的初学者,现在我正在学习指针和动态内存分配。我想编写一个简单的程序来创建空数组并检查给定数字是否存在。这是我的代码:
++j + j*5
但是当我运行程序时,当我寻找0时,我总是得到'是',所以
/* 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 :(得分:5)
有没有办法区分整数0和一个完整的空数组?
如何定义一个空数组?一旦分配了内存块并将其分配给指针,它就已经有了一些值(在alloc
的情况下未定义)。最常用的方法是将指针标记为未使用或未分配操作系统为其指定NULL。
此外,我不确定我的函数createArray()是否是创建空数组的正确方法。
sizeof
返回给定对象(或类型)在内存中占用的字节数。在你的情况下,sizeof(list)
返回8,因为它是一个指针。
在oder中分配一个数组,该函数必须接收它的大小。目前它总是仅为一个整数分配大小。
编辑:添加示例。
/* create an empty array pointer */ int* createArray(size_t size) { return (size ? (int*) malloc(sizeof(int)*size) : NULL); }
所以现在返回的指针应该与数组的大小“耦合”。这意味着接收数组作为参数的每个函数也应该接收它的大小。
答案 1 :(得分:0)
sizeof
都会返回数组指针的内存大小。
编辑:如果它存在于内存中,它将是非零的。
编辑3:删除不准确的信息,查看有关创建变量以记录长度的注释。同样来自注释,请注意您的createArray
函数正在为1个整数创建一个数组。在C中,数组具有固定长度。因此,此数组的大小始终相同(无论您是否存储了某些内容)。 sizeof(pointer)
将始终返回为指针分配的内存,而不是为其指向的数组分配的内存。