【问题标题】:C memory allocation not working as expected [duplicate]C内存分配未按预期工作[重复]
【发布时间】:2020-04-21 07:49:31
【问题描述】:

我是处理指针和内存分配的新手。我不明白我在做什么错。这是我的代码:

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

int main() {
     int* i;
     printf("Size of i:%d\n",sizeof(i));
     i = malloc(5 * sizeof(int));
     printf("Size of i:%d\n",sizeof(i));
     i[100] = 3;
     printf("Impossible i:%d\n",i[100]);
}

我使用gcc file.c 编译它。据我了解,这不应该被编译,因为i[100] 没有分配。相反,我得到一个输出:

Size of i:8
Size of i:8
Impossible i:3

我在这里缺少什么?忽略不可能的i,据我了解,前两行的输出应该是

Size of i:8
Size of i:40

【问题讨论】:

  • sizeof 不会给你指针指向的分配内存的大小,而是指针本身的大小,它是恒定的,通常是 4 或 32 位平台和 8 64 位平台。
  • @Jabberwocky 我明白了,那么如何获得数组的大小?
  • 如果您有int array[some_size]sizeof (array) 是数组的总大小(以字节为单位)。如果您有int *array = malloc(some_size),则无法获得array 指向的内存大小。
  • 您将“未编译”与“未正确运行”混淆了。 C 不会检测到所有运行时错误。如果可以,它将能够解决停机问题,这很容易证明是不可能的。与大多数解释型语言不同,C 没有你习惯的训练轮。相反,您必须同意不违反任何数量的规则,并作为回报保证正确运行。如果您违反了这些规则中的任何一条,那么所有赌注都将被取消。您违反了规则(您写到了动态分配数组的末尾)。所有赌注都取消了。
  • 对于给定的指针类型,sizeof(pointer) 是常量。它与sizeof(array) 不同。事实上,sizeof(i) 甚至在您将任何内容分配给 i 之前就已经明确定义了。与sizeof(int *) 相同。如果你想要动态分配数组的大小,你必须记住你是如何分配它的。将大小保存在变量中。

标签: c arrays dynamic-memory-allocation


【解决方案1】:

据我了解,这不应该被编译,因为 i[100] 没有分配。

只是undefined behaviour 访问越界。对于未定义的行为,编译器可能会或可能不会发出诊断信息。语言没有要求。

忽略不可能的 i,据我了解 前两行应该是

i:8 的大小
i:40的大小

指针上的sizeof 运算符与数组不同,不能推断出它指向的内存块的大小。它总是会给出指针的大小,即sizeof(i) == sizeof (int*)

没有办法从指针中推断出来;你只需要自己跟踪它。一种方法是将值 5 存储在一个变量中,如果 malloc 成功,您就知道有 5 个 int 的空间。

【讨论】:

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