我的猜测是这是因为 *ptr 应该指向某个数组或变量的地址,如果不指向任何东西,就不能包含值本身。
这是正确的; *ptr = 10; 不会改变ptr 指向的位置,因此您必须先将其设置为指向可用内存。
int *ptr = NULL; 将 ptr 初始化为 空指针 值,该值本质上表示“无处”。它是一些不等于任何对象或函数的地址的值。 (最常见的是,C 实现对空指针使用“零地址”。)
您可以通过多种方式将ptr 设置为指向可用内存:
int x;
ptr = &x; // This sets ptr to point to x.
int a[17];
ptr = &a[3]; // This sets ptr to point to a[3].
ptr = &a[0]; // This sets ptr to point to a[0].
ptr = a; // This also sets ptr to point to a[0].
在最后一个示例中,数组a 自动转换为指向a[0] 的指针。
你也可以动态分配内存:
ptr = malloc(sizeof *ptr);
if (ptr == NULL)
{
fprintf(stderr, "Error, unable to allocate memory.\n");
exit(EXIT_FAILURE);
}
调用malloc 要求系统保留内存。如果成功,则返回内存地址。如果失败,则返回一个空指针,您应该始终在调用malloc 后通过测试来处理这种可能性。你可以#include <stdio.h>声明fprintf和#include <stdlib>声明exit和EXIT_FAILURE。
以上任意一项后,可以执行*ptr = 10;将10存入ptr指向的位置。
当您使用分配的内存时,您通常希望在使用完后释放它。你可以通过拨打free(ptr)来做到这一点。
malloc(sizeof *ptr) 为ptr 指向的一个类型的对象分配足够的内存。您可以使用ptr = malloc(N * sizeof *ptr) 为N 对象分配内存。之后,如果调用成功,您可以将值存储在ptr[0]、ptr[1]、...ptr[N-1]。