#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已经停止工作”。错误是什么?
答案 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;
行进行评论,那么您的计划就会有效。您可以显示未初始化指针的地址,但如果您尝试更改该地址中的值,程序将会崩溃。