【问题标题】:In C, how can I initialize all elements in an array of pointers within a structure to null?在 C 中,如何将结构内的指针数组中的所有元素初始化为 null?
【发布时间】:2014-02-02 04:49:17
【问题描述】:

我是 C 的新手,我想知道如何将指针数组中的所有元素设置为 null。 我创建了一个结构,其中包含一个指向指针数组的指针,并且我想将所有这些指针设置为 null。

结构如下:

typedef struct
{
    char **array;
    int size, capacity;
} ArrayList;

在这里我尝试创建一个指针数组并将它们初始化为 null:

ArrayList *createArrayList(int length)
{
    int i;
    ArrayList* strArray = malloc(sizeof(ArrayList));
    for(i=1; i<length; i++)
    {
    strArray->array[i] = NULL;
    }
return strArray;
}

不幸的是,这会产生分段错误。任何帮助将不胜感激。

【问题讨论】:

  • 首先为array成员分配内存;不仅仅是指向ArrayList 的本地指针。

标签: c arrays pointers initialization


【解决方案1】:
strArray->array[i] = NULL;

您不能这样做,因为您没有为array 分配内存。您需要将其分配为

strArray->array = malloc(sizeof(char *) * length);

然后将所有元素初始化为NULL

您也可以使用calloc 将内存设置为0,在这种情况下您不需要for 循环。

strArray->array = calloc(length, sizeof(char *));

【讨论】:

  • 我大体上同意strArray-&gt;array = calloc(length, sizeof(char *)); 就足够了。一个强大的解决方案将使用 for(i=0; i&lt;length; i++) strArray-&gt;array[i] = NULL;,因为 NULL 并不总是 0.. 这涉及一些技术大楼被遗忘的大厅中的一些计算机。
  • 哦,笨蛋,不知道我怎么忽略了这一点。非常感谢!
  • @chux:空指针常量NULL 宏被定义为)始终为 0 值 (6.3.2.3/3)。
  • @chux:我不确定你和 John Bode 是否存在分歧,但我认为你们两个在谈论不同的事情。确实,空指针的内部表示不需要由全零位组成,因此不保证 calloc 在这里工作。但是您在评论中写道“NULL 并不总是 0”,这听起来像 C 源代码中的 NULL 宏,它 is (可能是强制转换的)0。但也许现在还为时过早早上让我了解 cmets。
  • @chux:真正了解异国现代硬件(阅读:任何不是 x86 的东西)的人需要回答这个问题。但是要小心的一个理由可能是,当我们几十年前的代码需要在虚拟量子云计算机上运行时,我们不知道空指针将来会是什么样子。 (甚至是核虚拟量子云涡轮计算机,在我看来,这是 80 年代多核处理器上的 64 位线程程序。)
【解决方案2】:

首先,

ArrayList* strArray = malloc(sizeof(ArrayList));

只为strArray 实例本身分配空间;它不会为您的array 成员分配任何东西。您必须单独分配该内存:

strArray->array = calloc( length, sizeof *strArray->array );

calloc 将对数组的所有元素进行零初始化。

【讨论】:

    【解决方案3】:

    您必须为指针数组和结构分配内存。你应该从 0 开始循环,因为 C 数组是从 0 开始的。

    ArrayList *createArrayList(int length)
    {
        int i;
        ArrayList* strArray = malloc(sizeof(ArrayList));
        strArray->array = malloc(length * sizeof(char *));
        for (i = 0; i < length; i++)
        {
            strArray->array[i] = NULL;
        }
        return strArray;
    }
    

    【讨论】:

      【解决方案4】:

      它们已经为空。您遇到 seg 错误是因为您无法分配给尚未分配的变量。从线

      strArray->array[i] = NULL;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多