我对此计划感到困惑。
#include <stdio.h>
int main(void)
{
int value = 10;
char ch = 'A';
int* ptrValue = &value;
char* ptrCh = &ch;
int* ptrValue1 = value;
char* ptrCh1 = ch;
printf("Value of ptrValue = %d and value of ptrValue1 = %d\n", *ptrValue, ptrValue1);
printf("Value of ptrCh = %c and value of ptrCh1 = %c\n", *ptrCh, *ptrCh1);
}
编译此程序时我收到两条警告
的UniPro @ ubuguest:/ SoftDev / ADSD /模块 1 / Unit 1 / Rd / C / System $ cc charPointers.c -o charPointers
charPointers.c:在功能上 'main':
charPointers.c:11: 警告:初始化使指针 来自没有演员的整数
charPointers.c:12:警告: 初始化使指针来自 没有强制转换的整数
我知道他们的意思。
运行程序时出现以下错误。
的UniPro @ ubuguest:/ SoftDev / ADSD /模块 1 / Unit 1 / Rd / C / System $ ./charPointers
ptrValue的值 = 10并且ptrValue1 = 10的值>分段错误
我知道我在第二次printf方法时遇到错误。
所以我的问题是如果我在指针中存储一个值,为什么我们不能去引用它呢?它的行为是否像变量一样?
感谢。
答案 0 :(得分:5)
通过作业
char* ptrCh1 = ch;
您将地址设置为0x41,而不是值。程序稍后将尝试取消引用0x41(即,在地址0x41处获取数据),这是一个非法地址。因此,分段错误
答案 1 :(得分:2)
指针存储某事物的地址(或NULL)。因此int *可以存储int的地址。您可以使用一元&
运算符获取某些内容的地址。
那么,将10
存储在int指针中意味着什么?好吧,10不是int的地址,所以你得到“初始化使得指针来自没有强制转换的整数”警告,并且因为你在int *中存储了除int的地址以外的其他内容并尝试取消引用它,你得到未定义的行为。
在你的情况下可能发生的事情是10被解释为一个内存地址,当你取消引用一个指针时,它会去取取该地址的任何内容(在你的情况下是内存地址10)。可能没有任何内容,没有映射内存区域,并且你是段错误。
答案 2 :(得分:1)
你可以取消引用它,但你获得有效内存块的可能性非常小。此处有效表示您的流程具有该点的访问权限。
操作系统将阻止您修改不属于您的进程的内存。它通过分段错误“异常”响应那种无效的内存访问。
答案 3 :(得分:1)
指针指向一个内存位置(然后您可以在其中存储一些值)。在这里
int* ptrValue1 = value;
char* ptrCh1 = ch;
指定变量的值的指针(而不是地址),因此指针很可能指向无效的内存位置,因此是段错误。
请注意,在许多体系结构中,有效的内存位置以高偏移量开始,因此像“A”这样的小整数值或“A”的(ASCII值)永远不能指向有效的内存位置。这种低内存位置通常由操作系统本身保留/使用(因此它们可以防止修改 - 如果您尝试,则会出现段错误)。如果您尝试直接访问另一个进程使用的内存,通常会发生同样的情况。
答案 4 :(得分:0)
这是因为最后一行中的*ptrCh1
,你试图取消引用它。删除*
以使其正常工作(不过它没有多大意义)。
答案 5 :(得分:0)
确定它必须是段错误的。你在指针中存储任何值(正如你所说的编译器警告你),然后你取消引用它,无论它指向何处。 你还有什么期望?