以下关于指针的C程序不起作用

时间:2014-07-21 14:14:41

标签: c pointers

#include<stdio.h>
int main(void)
{
    int *pc;
    *pc=100;
    printf("\n Address of Pointer : %d",pc);
    printf("\n Contents of Pointer : %d",*pc);
}

当我在eclipse中运行代码时,它说“Pointers.exe已经停止工作”。错误是什么?

5 个答案:

答案 0 :(得分:1)

将值分配给*pc特别危险。如果pc包含有效的内存地址,则为赋值

*pc = 100;

将尝试修改存储在该地址的数据 如果此作业修改的位置属于该程序,则其行为可能不正常;如果它属于操作系统,程序很可能崩溃

您的编译器应该发出pc未初始化的警告。

答案 1 :(得分:0)

将其更改为:

    int a;
    int *pc;

    pc = &a; 
    *pc = 100;

您的pc指针未在您的程序中初始化。

此外,您打印指针值的方式不正确,请使用:

printf("\n Address of Pointer : %p", (void *) pc);

答案 2 :(得分:0)

您忘了将pc指向有用的地方。当你写

int *pc;

编译器为您创建指针。指针指向内存中的某个位置,你无法知道在哪里。机会是,它指向记忆中的坏地方。当您使用*pc=...覆盖它时,您将覆盖内存中不应覆盖的位置。

所以你需要pc指向某个地方。

int a, *pc=&a;

会做到这一点。现在,编译器为您准备一个int,然后将pc指向它。这样,当你通过指针写入时,不会发生任何不好的事情 - 你正在写一个你知道安全的记忆区域。

初始化pc的另一种方法是:

int *pc = (int*)malloc(sizeof(int)); // Allocate an integer on the heap

现在*pc=100;也可以使用。完成后不要忘记free(pc)

答案 3 :(得分:0)

你有:

int *pc;
*pc=100;

当您将指针定义为上面的整数pc时,此指针未初始化,因此它指向您尚未分配的某些内存,而您无权访问。

所以你的可执行文件崩溃了。

只需使用有效的指针,例如您可以使用malloc(sizeof(int))分配一些堆内存(稍后使用free()释放它),或者只使用基于堆栈的内存用于本地自动变量,例如:

/* An integer stack-allocated variable */
int n = 64;

/* Pointer to that integer */
int * pn = &n;

/* Change its value */
*pn = 100;

此外,要打印地址,请考虑使用%p的{​​{1}}说明符。

e.g:

printf()

输出:

#include <stdio.h>

int main(void)
{
    int n = 64;
    int *pn = &n;    

    printf("n (before): %d\n", n);

    *pn = 100;
    printf("n (after): %d\n", n);

    printf("Address of n: %p", (void *)pn);

    return 0;
}

答案 4 :(得分:0)

指针需要点!指针是包含另一个变量的地址的变量。

int *pc;

此指针包含一些垃圾值。谁知道之前记忆中的内容。它指向的地址可能是另一个程序占用的内存地址。如果要更改该地址中的值,则需要为指针指定有效的地址。

如果要计算数组所有成员的总和,则必须将变量sum初始化为0,因为它可能包含其他值。

指针也一样。如果要修改值,它们必须包含变量的有效地址。

如果您对*pc = 100;行进行评论,那么您的计划就会有效。您可以显示未初始化指针的地址,但如果您尝试更改该地址中的值,程序将会崩溃。