我的Int*all数组是否已初始化为NULL?

Pet*_*ete 0 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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

$ ./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

$
Run Code Online (Sandbox Code Playgroud)

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

但这对我后来的计划来说是个问题.当我的代码将数据插入表[x]时,代码必须能够查看数组并知道先前是否在同一位置插入了另一个有效的int.如果它看到table [x] = 0,它是否会在索引x中插入0,或者该点是否可用?

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

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

但我不认为我正在编码我想要的东西.

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

谢谢!-Pete

Ben*_*ght 5

int* table = malloc(TABLESIZE * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

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

你得到错误的原因int*是a就是这样; 一个指针int.

*操作被称为"反引用"操作.放在变量之前的工作就是说'去指针指向的地方'.因此,行

*(table+i) = NULL; 
Run Code Online (Sandbox Code Playgroud)

表示'转到表所指向的位置,移动i * sizeof(int),然后将该特定设置int为NULL.这显然没有意义 - 你不能将a设置int为NULL,因为这是一个指针值.因此你的错误.

顺便说一句,由于指针也可以像C中的数组一样对待,上面的行也是完全相同的

table[i] = NULL;
Run Code Online (Sandbox Code Playgroud)

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

int** table = malloc(TABLESIZE * sizeof(int*));
Run Code Online (Sandbox Code Playgroud)

然后,你有一个int**(双指针-又名指针的指针)引用的TABLESIZE块int*

完成此操作后,该行下方的代码将正确设置指针NULL.然后,为了实现您的问题中描述的表格,您需要在放入其中之前为每个单元格执行另外的malloc int.例如,将'3'放入单元格2中

if(*(table + 2) == NULL) {
   *(table + 2) = malloc(sizeof(int));
}
**(table + 2) = 3;
Run Code Online (Sandbox Code Playgroud)

注意最后一行的双重尊重:"去哪里table指向,一起移动2 * sizeof(int*),然后去哪里指针指向." 同样,这也可以通过数组语法实现

if(table[2] == NULL) {
    table[2] = malloc(sizeof(int));
}
*table[2] = 3;
Run Code Online (Sandbox Code Playgroud)

小心不要malloc()两次打电话给同一个小区; 如果你这样做,你将有内存泄漏.