c - 我的 Int* 数组是否全部初始化为 NULL?

标签 c arrays pointers initialization

我是一名努力理解 C 指针和数组的 Java 程序员。 (完全披露:我也是一名 CS 学生,是的,这个问题帮助我完成了一项编程任务。)

我正在尝试创建一个 int* 指针数组,然后确保每个指针都为 NULL。稍后,当我需要在数组中查找数据时,这将发挥作用;在给定位置是否存在有效的 int 或 NULL 将很重要。

所以为数组分配空间很容易,但是如何将所有这些指针都设置为 NULL 呢?这是我不太成功的尝试:

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

#define TABLESIZE   10

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

    int* table = (int*) malloc(TABLESIZE * sizeof(int));

    // Initialize all *int pointers to NULL
    int i;
    for(i=0; i<TABLESIZE; i++){
        if((table+i)!=NULL){           // They may be NULL already?  I don't know...
            *(table+i) = NULL;         // This generates a warning:
                                       // "warning: assignment makes integer from pointer without a cast [-Wint-conversion]"
        }
    }

    // Sanity check :  are all int* are NULL ?
    for(i=0; i<TABLESIZE; i++){
        printf("%d:  %p  %d ", i, (table+i), *(table+i));
        if((table+i) == NULL)
            printf("(NULL)");
        printf("\n");
    }

    free(table);
    return 1;
}

输出是:

$ ./a.exe
0:  0x6000103c0  0
1:  0x6000103c4  0
2:  0x6000103c8  0
3:  0x6000103cc  0
4:  0x6000103d0  0
5:  0x6000103d4  0
6:  0x6000103d8  0
7:  0x6000103dc  0
8:  0x6000103e0  0
9:  0x6000103e4  0

$

所以我会非常诚实......我不知道上面告诉我的是什么。我猜我已经创建了一个一维数组,其中数组中的所有值都是有效的整数,全部为 0。

但这在我的程序后面会有问题。当我的代码需要将数据插入表 [x] 时,代码必须能够查看数组并知道之前是否在同一位置插入了另一个有效的 int。如果它看到 table[x] = 0,它会断定索引 x 中插入了 0,还是该位置可用?

我喜欢使用指向整数的指针数组的想法,因为这可以巧妙地解决这个问题。如果我的代码看到:

  • table[x] --> NULL//这个位置是空的并且可用
  • table[x] --> 0//这个位置被占用了,不能插入

但我不认为我在编写我想要的代码。

非常感谢任何想法/建议/评论/批评。

谢谢! -皮特

最佳答案

int* table = malloc(TABLESIZE * sizeof(int));

不创建指针数组,而是创建单个 int 指针,指向大小为 (TABLESIZE * sizeof(int)) 的已分配内存块的开头

您收到错误的原因是 int* 就是这样;指向 int 的指针。

* 运算符称为“取消引用”运算符。当放置在变量之前时,它的作用是说“转到该指针指向的任何地方”。因此,行

*(table+i) = NULL; 

意思是'转到表指向的任何地方,沿着i * sizeof(int)移动,然后将那个特定的int设置为NULL。这显然没有意义 - 您不能将 int 设置为 NULL,因为那是一个指针值。因此你的错误。

顺便说一句,因为指针在 C 中也可以像数组一样处理,所以上面这行也完全等同于

table[i] = NULL;

如果您希望您的初始 malloc 是一个指针数组,您需要为 int* 而非 int 分配空间,所以您可以这样做

int** table = malloc(TABLESIZE * sizeof(int*));

然后你有一个 int**(双指针 - 也称为指向指针的指针)引用一个 TABLESIZE int* 的 block

完成此操作后,该行下方的代码会将您的指针正确设置为 NULL。然后要按照您的问题中所述实现表格,您需要在将 int 放入其中之前为每个单元格执行进一步的 malloc。因此,例如将“3”放入单元格 2

if(*(table + 2) == NULL) {
   *(table + 2) = malloc(sizeof(int));
}
**(table + 2) = 3;

请注意最后一行的双重引用:'转到 table 指向的任何地方,沿着 2 * sizeof(int*) 移动,然后转到任何地方 那个指针指向。同样,这也可以通过数组语法来实现

if(table[2] == NULL) {
    table[2] = malloc(sizeof(int));
}
*table[2] = 3;

注意不要在同一个单元格上调用 malloc() 两次;如果你这样做,你将有内存泄漏。

关于c - 我的 Int* 数组是否全部初始化为 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39779279/

相关文章:

python - 搜索一个数组中的特定元素并复制另一数组中的整个相应行

c++ - 链表 - 元素在删除后出现

python - CPython 解释器如何处理 OOP

C typedef 正确用例

c++ - 为什么指向 char 的指针与指向 char 作为数组元素的指针的行为不同?

Javascript 与 ES6 的嵌套 for 循环

c++ - 相同的代码在在线 IDE 和本地 IDE 中给出不同的结果

C 中函数的类型冲突

c - 函数 idr_alloc(...) 有时会失败并出现错误 -EINVAL(-22)

c - 从文件中读取一行并用 C 解析它