【问题标题】:Why no integer in a pointer straight?为什么指针中没有整数?
【发布时间】:2022-07-16 18:45:02
【问题描述】:
#include <stdio.h>

int main(void)
{
    int* ptr = NULL;
    *ptr = 10;
    printf("%d", *ptr);
    return 0;
}

我对 C 编程非常陌生,如果它变得无知,请提前道歉。 我正在尝试输入一个值,访问分配给 NULL 但它不起作用的指针变量。

我的猜测是这是因为 *ptr 应该指向某个数组或变量的地址,如果不指向任何东西,就不能包含值本身。

我的理解正确吗?

【问题讨论】:

  • 是的,没错。 NULL 在这里表示“无”,因此没有为指针分配内存。你需要内存来存储一些东西。

标签: c pointers


【解决方案1】:

是的,你的理解是正确的,你不能做你代码试图做的事情

int main(void)
{
    int* ptr = NULL;   <<== creates a pointer that points noweher (null)
    *ptr = 10;      <<== store 10 where that pointer points
    printf("%d", *ptr);
    return 0;
}

在第二行中,您尝试将 10 存储在 'ptr' 指向的位置。但是 'ptr' 没有指向任何地方,结果就是所谓的未定义行为。通常你的程序会停在那里

你可以这样做

int main(void)
{
    int* ptr = NULL;  <<<=== create pointer to nothing
    int val = 0;       << == create int with value 0
    ptr = &val;       <<<== set ptr to point at val
    *ptr = 10;        <<< ====overwrite val with 10
    printf("%d", *ptr);
    return 0;
}

线

 *ptr = 10;

做的和你做的一样

 val = 10;

你也可以这样做

int main(void)
{
    int* ptr = NULL;  <<<=== create pointer to nothing
    ptr = malloc(sizeof(int); <<<== set ptr to point at dynamically allocated int
    if(ptr==NULL) return -1; <<<=== make sure it worked
    *ptr = 10;   <<< === now set that dynamically allocated int to 10
    printf("%d", *ptr);
    return 0;
}

请注意,与前面的示例不同,没有其他方法可以引用 int。 (之前你可以交替使用 'val' 和 '*ptr')

【讨论】:

  • 如何也添加一个带有 malloc 的示例?或者至少提到它
  • @EricPostpischil 这取决于你对他们最后一句话的最后一句话的理解,但是是的,也许我可以修正我的措辞
  • 感谢大家的参与和讨论。
【解决方案2】:

我的猜测是这是因为 *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 &lt;stdio.h&gt;声明fprintf#include &lt;stdlib&gt;声明exitEXIT_FAILURE

以上任意一项后,可以执行*ptr = 10;将10存入ptr指向的位置。

当您使用分配的内存时,您通常希望在使用完后释放它。你可以通过拨打free(ptr)来做到这一点。

malloc(sizeof *ptr)ptr 指向的一个类型的对象分配足够的内存。您可以使用ptr = malloc(N * sizeof *ptr)N 对象分配内存。之后,如果调用成功,您可以将值存储在ptr[0]ptr[1]、...ptr[N-1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-07
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多