【问题标题】:Dynamic array without malloc?没有malloc的动态数组?
【发布时间】:2021-03-29 02:51:36
【问题描述】:

我在阅读一些源代码时发现了一个基本上允许您将数组用作链表的功能?代码工作如下:

#include <stdio.h>

int
main (void)
{
    int *s;
    
    for (int i = 0; i < 10; i++)
    {
        s[i] = i;
    }
    
    for (int i = 0; i < 10; i++)
    {
        printf ("%d\n", s[i]);
    }
    
    return 0;
}

我知道s 在这种情况下指向数组的开头,但从未定义数组的大小。为什么这行得通,它的局限性是什么?内存损坏等

【问题讨论】:

  • 这不起作用,这充其量是未定义的行为。它可能会起作用或不起作用,但请不要依赖这种行为。
  • 失去互联网连接的瞬间

标签: arrays c pointers memory initialization


【解决方案1】:

为什么会这样

它没有,它似乎工作(这实际上是运气不好)。

它的局限性是什么?内存损坏等。

Undefined behavior.

请记住:在您的程序中,无论您尝试使用什么内存位置,都必须对其进行定义。要么您必须使用编译时分配(例如,标量变量定义),要么对于指针类型,您需要使它们指向某个有效内存(先前定义的变量的地址),或者在运行时(使用分配器函数)。使用任何不确定的任意内存位置都是无效的,会导致UB。

【讨论】:

    【解决方案2】:

    我知道在这种情况下 s 指向数组的开头

    没有指针具有自动存储持续时间并且没有被初始化

    int *s;
    

    所以它有一个不确定的值并且没有指向。

    但数组的大小从未定义

    程序中没有声明或定义数组。

    为什么会这样,它有什么局限性?

    这是偶然的。也就是说,当您运行它时,它会产生预期的结果。但实际上程序有未定义的行为。

    【讨论】:

      【解决方案3】:

      正如我在 cmets 上首先指出的那样,您所做的不起作用,似乎起作用,但实际上是undefined behaviour

      在计算机编程中,未定义行为 (UB) 是 执行一个行为被规定为不可预测的程序, 在计算机代码所遵循的语言规范中。

      因此,它有时可能“起作用”,有时则不起作用。因此,永远不要依赖这种行为。

      如果在 C 中分配一个动态数组会那么容易,那么人们会使用 malloc 吗?!尝试使用比10 更大的值,以增加导致segmentation fault 的可能性。

      查看SO Thread 以了解如何在 C 中正确分配和排列。

      【讨论】:

        猜你喜欢
        • 2011-10-03
        • 1970-01-01
        • 2016-04-06
        • 1970-01-01
        • 2013-06-06
        • 2012-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多