【发布时间】: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